Variation in the production of te reo Māori opening vowel sequences: Supplementary Materials

Authors
Affiliations

Kirsten Culhane

New Zealand Institute of Language, Brain and Behaviour, University of Canterbury

Jen Hay

New Zealand Institute of Language, Brain and Behaviour, University of Canterbury

Department of Linguistics, University of Canterbury

Simon Todd

University of California, Santa Barbara

Márton Sóskuthy

University of British Columbia

Allie Osborne

Department of Linguistics, University of Canterbury

Penny Harris

Department of Linguistics, University of Canterbury

Kate Maindonald

Department of Linguistics, University of Canterbury

Jeanette King

Aotahi School of Māori and Indigenous Studies, University of Canterbury

New Zealand Institute of Language, Brain and Behaviour, University of Canterbury

Forrest Panther

Department of Linguistics, University of Canterbury

Peter Keegan

University of Auckland

Published

November 3, 2025

1 Overview

This markdown file contains supplementary materials for the manuscript “Variation in the production of te reo Māori opening vowel sequences”. It contains all code used for data selection, acoustic measurements and filtering, as well as the analysis and data visualisations. This document is structured as follows:

  • Section 2 loads the R packages used

  • Section 3 outlines the data selection and annotation procedure

  • Section 4 contains the code for measuring formats, pitch, intensity, and for for filtering the data laid out in §3.3 of the manuscript. This section contains a number of non-executable chunks, some of which require a LaBB-CAT account to run. They have been included for archiving purposes.

  • Section 5 explores how many data points are lost by our filtering process, which is reported in Footnote 3, 4 and 5.

  • Section 6 contains the code for the fPCA analysis. which is described in §3.4 of the manuscript and relevant results reported in Appendix A

  • Section 7 contains the code for filtering the duration data, which is described in §3.3.3 of the manuscript

  • Section 8 contains the code for the uPCA analysis and visualizations, which are presented in §4.1 of the manuscript

  • Section 9 examines the possibility that speakers with predominantly high uPC1 scores and predominantly low uPC1 scores have different monophthong spaces, and that the different trajectory we see between high and low uPC1 tokens are actually a reflection of these differences (Footnote 7 of the manuscript)

  • Section 10 contains the code for the regression analysis and visualizations, which are presented in §4.2 of the manuscript

  • Section 11 contains the code for the speaker intercept analysis, which is described in §4.3.1 of the manuscript

  • Section 12 contains code for the visualizations of monophthongs and sequence trajectories, plotted per speaker category, which are presented in §4.3.2 of the manuscript

  • Section 13 examines the possibility that there a relationship between raising of /e/ and merging of /ia/ and /ea/ in Māori, which is disscussed in §4.3.2 of the manuscript

2 Libraries

  1. Required libraries.
Click here to view code.
# Data manipulation and visualisation
library(tidyverse)
library(janitor)
library(formatR)
library(gganimate)
library(gridExtra)
library(grid)
library(ggrepel)
library(scales)
library(glue)
library(factoextra)
library(gridExtra)
library(geomtextpath)
library(sjPlot)
library(RColorBrewer)

#Measurements
library(nzilbb.labbcat)
library(rmdformats)
library(rPraat)

# Statistical analyses
library(nzilbb.vowels)
library(fdapace)
library(mgcv) 
library(locfit)
library(itsadug)
library(qgam)
library(lme4)
library(lmerTest)
library(car)
library(emmeans)

# Other
library(here) # localised file paths
library(knitr)
library(kableExtra) # html tables when rendering
library(grateful) # write package citations at end of document
library(extrafont) # to use custom fonts in 
library(xtable) 

3 Data selection and annotation (Manuscript §3.2)

  1. Data from the MAONZE corpus: all tokens of opening sequences, and monopthongs which occur between two consonants
Click here to view code.
opening_seqs <- read.csv(here("Data", "MAONZE_opening_seqs.csv")) 

betweenConsonantsMatches <- read.csv(here("Data", "betweenConsonantsMatches.csv"))
 

participant_info <- opening_seqs %>% 
  select(Speaker, participant_gender, category) %>% 
  unique()
  1. Various functions for data selection

Function to remove punctuation and whitespace

Click here to view code.
remove_punctuation_whitespace <- function(string) {
  # Use gsub to replace punctuation and whitespace with an empty string
  gsub("[[:punct:][:space:]]", "", string)
}

Functions to identify if vowel sequence is initial or final in the word

Click here to view code.
VV_initial <- function(word, vowel_sequence) {
  return(substr(word, 1, nchar(vowel_sequence)) == vowel_sequence)
}

VV_final <- function(word, vowel_sequence) {
  return(substr(word, nchar(word) - nchar(vowel_sequence) + 1, nchar(word)) == vowel_sequence)
} 

Function to identify if words are V-final or V-initial

Click here to view code.
V_final <- function(string) {
  string <- tolower(string)
  n <- nchar(string)
  if (n < 1) {
    return(FALSE)
  }
  last_char <- substring(string, n, n)
  last_char %in% c("a", "e", "i", "o", "u")
}

V_initial <- function(string) {
  first_char <- tolower(substring(string, 1, 1))
  first_char %in% c("a", "e", "i", "o", "u")
}

Function to identify sequences of three vowels

Click here to view code.
three_vowels <- function(word, vowel_sequence) {
  pattern <- paste0("(?<=[aeiou])", vowel_sequence, "|", vowel_sequence, "(?=[aeiou])")
  return(grepl(pattern, word, perl = TRUE))
}
  1. Prepare Before.Match (previous word) data. Here we replace V: with vv in the Before.Match column. This is because colons <:> will affect the results when filtering instances where the previous word is vowel final (i.e. if a word ends with orthographic v:, it will not be considered vowel-final )
Click here to view code.
opening_seqs$Before.Match = str_replace_all(opening_seqs$Before.Match, "a:", "aa")
opening_seqs$Before.Match = str_replace_all(opening_seqs$Before.Match, "e:", "ee")
opening_seqs$Before.Match = str_replace_all(opening_seqs$Before.Match, "i:", "ii")
opening_seqs$Before.Match = str_replace_all(opening_seqs$Before.Match, "o:", "oo")
opening_seqs$Before.Match = str_replace_all(opening_seqs$Before.Match, "u:", "uu")
  1. Exclude various vowel sequences using functions defined above
Click here to view code.
data_filtered <- opening_seqs %>%
#determine if the sequence is initial in the word 
   mutate(word_VV_initial = mapply(VV_initial, 
                                        Target.orthography, 
                                        Target.vowelCluster)) %>% 
   #remove punctuation from before matches, bcs  can affect the results of  prev_V (e.g various words end with . , which could mean  it is not  considered vowel-final )
  mutate(Before.Match = remove_punctuation_whitespace(Before.Match)) %>% 
  #determine if the previous word is V final  
   mutate(prev_v = ifelse(sapply(Before.Match, V_final), TRUE, FALSE)) %>% 
  #if word_VV_initial = TRUE and prev_v = TRUE, filter it out 
    filter(!(word_VV_initial & prev_v)) %>% 
#determine if the sequence is final in the word
   mutate(word_VV_final = mapply(VV_final, 
                                        Target.orthography, 
                                        Target.vowelCluster)) %>% 
   #is the next word vowel initial?
  mutate(following_V = ifelse(sapply(After.Match, V_initial), TRUE, FALSE)) %>% 
  #if word_VV_final = TRUE and following_V = TRUE, filter it out 
  filter(!(word_VV_final & following_V ))  %>% 
  #determine if sequence occurs in seq of 3 vowels
mutate(three_vowels = mapply(three_vowels, Target.orthography, Target.vowelCluster)) %>% 
  #filter out three_vowels = TRUE
 filter(!(three_vowels)) %>% 
#filter out instances where seq occurs more than once
    mutate(VV_occurence = str_count(Target.orthography, Target.vowelCluster)) %>% 
  filter(VV_occurence < 2)  %>%
#filter out instances where the sequence is preceded by a long vowel
  filter(!mapply(function(vowel, word) grepl(paste0(":", vowel), word), 
                 Target.vowelCluster, Target.orthography))

#remove unnecessary columns
data_filtered <- data_filtered %>% 
  select(-word_VV_final, -following_V, -word_VV_initial, -prev_v, -VV_occurence, -three_vowels)
  1. Save as the selected data as a .csv
Click here to view code.
write.csv(data_filtered, here("Data", "opening_seqs_selected_data.csv"))

4 Acoustic measurements and filtering

4.1 Formants (Manuscript §3.3.1)

The following code extracts praat measurements for the formants, and requires a LaBB-CAT account. Chunks are set not to evaluate, measurements can be read in from provided csvs below.

4.1.1 Sequences formant measurments

  1. Define URL + intervals, separate data by sequence
Click here to view code.
url <- "https://labbcat.canterbury.ac.nz/maonze/"
intervals <- c(.1,.2,.3,.4, .5, .6, .7, .8, .9)

ia = data_filtered %>% filter(Target.vowelCluster == "ia")  
ua = data_filtered %>% filter(Target.vowelCluster == "ua") 
oa = data_filtered %>% filter(Target.vowelCluster == "oa") 
ea = data_filtered %>% filter(Target.vowelCluster == "ea") 
  1. /ia/ formant measurements
Click here to view code.
iaformants <- 
ia  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.vowelCluster.start,
    Target.vowelCluster.end,
    window.offset=0.025,
    paste(
      praatScriptFormants(sample.points = intervals,
                              formants = c(1, 2)))))


write.csv(iaformants, here("Data", "iaFormantsRaw.csv"))
  1. /ea/ formant measurements
Click here to view code.
eaformants <- ea  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.vowelCluster.start,
    Target.vowelCluster.end,
    window.offset=0.025,
    paste(
      praatScriptFormants(sample.points = intervals,
                              formants = c(1, 2)))))

write.csv(eaformants, here("Data", "eaFormantsRaw.csv"))
  1. /oa/ formant measurements
Click here to view code.
oaformants <- 
oa  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.vowelCluster.start,
    Target.vowelCluster.end,
    window.offset=0.025,
    paste(
      praatScriptFormants(sample.points = intervals,
                              formants = c(1, 2)))))

write.csv(oaformants, here("Data", "oaFormantsRaw.csv"))
  1. /ua/ formant measurements
Click here to view code.
uaformants <- 
ua  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.vowelCluster.start,
    Target.vowelCluster.end,
    window.offset=0.025,
    paste(
      praatScriptFormants(sample.points = intervals,
                              formants = c(1, 2)))))

write.csv(uaformants, here("Data","uaFormantsRaw.csv"))
  1. Read in data if need be
Click here to view code.
eaformants <- read.csv(here("Data", "eaFormantsRaw.csv"))
iaformants <- read.csv(here("Data", "iaFormantsRaw.csv"))
oaformants <- read.csv(here("Data", "oaFormantsRaw.csv"))
uaformants <- read.csv(here("Data", "uaFormantsRaw.csv"))
  1. Combine into a single data frame
Click here to view code.
allseqformants = rbind(eaformants,iaformants,oaformants,uaformants)
  1. Make separate data frames for F1 and F2, pivot longer
Click here to view code.
  allf1 =  allseqformants %>% pivot_longer(c(f1_time_0_1,f1_time_0_2,f1_time_0_3,
                 f1_time_0_4,f1_time_0_5,f1_time_0_6,
                 f1_time_0_7,f1_time_0_8,f1_time_0_9),
               names_to = "f1time",
               values_to = "f1") 
  allf2 =  allseqformants %>% pivot_longer(c(f2_time_0_1,f2_time_0_2,f2_time_0_3,
                 f2_time_0_4,f2_time_0_5,f2_time_0_6,
                 f2_time_0_7,f2_time_0_8,f2_time_0_9),
               names_to = "f2time",
               values_to = "f2")
  
 alllong = allf1 
 alllong$temptime = allf1$f1time
 alllong$time = as.numeric(substr(alllong$temptime, 11,11))
 alllong$f1 = allf1$f1
 alllong$f2 = allf2$f2
  1. Remove NAs
Click here to view code.
alllong = alllong[is.na(alllong$f1) != TRUE,]
alllong = alllong[is.na(alllong$f2) != TRUE,]
alllong$f1 = as.numeric(alllong$f1)
alllong$f2 = as.numeric(alllong$f2)
alllong$time = as.numeric(alllong$time)
  1. Save data frame
Click here to view code.
write.csv(alllong, here("Data", "openningseqs_formants_all_long.csv")) 

We will return later to normalize the data.

4.1.2 Monophthong formant measurements

The following chunks extract midpoint values for each monophthong

  1. /i/
Click here to view code.
monoi = betweenConsonantsMatches %>% filter(Target.teAkaSegment == "i")

monoiformants <- 
monoi  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.teAkaSegment.start,
    Target.teAkaSegment.end,
    window.offset=0.025,
    paste(
      praatScriptFormants(sample.points = 0.5,
                              formants = c(1, 2)))))

write.csv(monoiformants, here("Data","monoiFormantsRaw.csv"))    
  1. /e/
Click here to view code.
monoe = betweenConsonantsMatches %>% filter(Target.teAkaSegment == "e")
 
monoeformants <- 
monoe  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.teAkaSegment.start,
    Target.teAkaSegment.end,
    window.offset=0.025,
    paste(
      praatScriptFormants(sample.points = 0.5,
                              formants = c(1, 2)))))

write.csv(monoeformants, here("Data","monoeFormantsRaw.csv"))
  1. /a/
Click here to view code.
monoa = betweenConsonantsMatches %>% filter(Target.teAkaSegment == "a")
monoaformants <- 
monoa  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.teAkaSegment.start,
    Target.teAkaSegment.end,
    window.offset=0.025,
    paste(
      praatScriptFormants(sample.points = 0.5,
                              formants = c(1, 2)))))

write.csv(monoaformants, here("Data","monoaFormantsRaw.csv"))
  1. /o/
Click here to view code.
monoo = betweenConsonantsMatches %>% filter(Target.teAkaSegment == "o")

monooformants <- 
monoo  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.teAkaSegment.start,
    Target.teAkaSegment.end,
    window.offset=0.025,
    paste(
      praatScriptFormants(sample.points = 0.5,
                              formants = c(1, 2)))))

write.csv(monooformants, here("Data","monooFormantsRaw.csv"))
  1. /u/
Click here to view code.
monou = betweenConsonantsMatches %>% filter(Target.teAkaSegment == "u")

monouformants <- 
monou  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.teAkaSegment.start,
    Target.teAkaSegment.end,
    window.offset=0.025,
    paste(
      praatScriptFormants(sample.points = 0.5,
                              formants = c(1, 2)))))

write.csv(monouformants, here("Data","monouFormantsRaw.csv"))
  1. Read in data if need be
Click here to view code.
monoiformants = read.csv(here("Data", "monoiFormantsRaw.csv"))
monoeformants = read.csv(here("Data", "monoeFormantsRaw.csv"))
monoaformants = read.csv(here("Data", "monoaFormantsRaw.csv"))
monooformants = read.csv(here("Data", "monooFormantsRaw.csv"))
monouformants = read.csv(here("Data", "monouFormantsRaw.csv"))
  1. Create combined data frame
Click here to view code.
monoformants = rbind(monoiformants, monoeformants, monoaformants, monooformants, monouformants)

monoformants2 = monoformants %>% filter(is.na(f1_time_0_5) == FALSE)
  1. Remove outliers
Click here to view code.
monoformants2 <- monoformants2 %>% 
  rename(Speaker = Participant)

monoformants3 = left_join(monoformants2, participant_info, by = "Speaker")


prunedmono = monoformants3 %>% group_by(participant_gender, Target.teAkaSegment) %>%
  filter(f1_time_0_5< mean(f1_time_0_5)+2.5*sd(f1_time_0_5),
         f1_time_0_5> mean(f1_time_0_5)-2.5*sd(f1_time_0_5),
         f2_time_0_5< mean(f2_time_0_5)+2.5*sd(f2_time_0_5),
         f2_time_0_5> mean(f2_time_0_5)-2.5*sd(f2_time_0_5))
         
monophthongs = prunedmono

4.1.3 Normalisation

This section uses Lobanov 2.0 code, taken from (Brand et al. 2021) supplementaries

  1. Standard Lobanov normalisation - calculate means across all vowels per speaker
Click here to view code.
monophthongs$F1_50 = monophthongs$f1_time_0_5
monophthongs$F2_50 = monophthongs$f2_time_0_5
summary_vowels_all_lobanov <- monophthongs %>%
  group_by(Speaker) %>%
  dplyr::summarise(mean_F1_lobanov = mean(F1_50),
            mean_F2_lobanov = mean(F2_50),
            sd_F1_lobanov = sd(F1_50),
            sd_F2_lobanov = sd(F2_50),
            token_count = n())
  1. Lobanov 2.0 - calculate means per vowel and per speaker
Click here to view code.
summary_vowels_all <- monophthongs %>%
  group_by(Speaker, Target.teAkaSegment) %>%
  dplyr::summarise(mean_F1 = mean(F1_50),
            mean_F2 = mean(F2_50),
            sd_F1 = sd(F1_50),
            sd_F2 = sd(F2_50),
            token_count_vowel = n())
  1. Get the mean_of_means and sd_of_means from the the speaker_summaries. This will give each speaker a mean calculated from the means across all vowels, as well as the standard deviation of the means
Click here to view code.
summary_mean_of_means <- summary_vowels_all %>%
  group_by(Speaker) %>%
  dplyr::summarise(mean_of_means_F1 = mean(mean_F1),
            mean_of_means_F2 = mean(mean_F2),
            sd_of_means_F1 = sd(mean_F1),
            sd_of_means_F2 = sd(mean_F2)
            )
  1. Combine these values with the full sequences raw dataset , then use these values to normalise the data with both the Lobanov and the Lobanov 2.0 method
Click here to view code.
pruned = alllong 

sequencesall <- pruned %>%
  #add in the data
  left_join(., summary_mean_of_means, by="Speaker") %>%
  #normalise with Lobanov 2.0
  mutate(F1_lobanov_2.0 = (f1 - mean_of_means_F1)/sd_of_means_F1,
         F2_lobanov_2.0 = (f2 - mean_of_means_F2)/sd_of_means_F2) %>%
  #remove the variables that are not required
  dplyr::select(-(mean_of_means_F1:sd_of_means_F2))
  1. Normalize the monophthongs
Click here to view code.
monophthongs$f1 = monophthongs$F1_50 
monophthongs$f2 = monophthongs$F2_50 

monophthongsall <- monophthongs %>%
  #add in the data
  left_join(., summary_mean_of_means, by="Speaker") %>%
  left_join(., summary_vowels_all[, c("Speaker", "Target.teAkaSegment", "token_count_vowel")]) %>%
  left_join(., summary_vowels_all_lobanov) %>%
  #normalise the raw F1 and F2 values with Lobanov
  mutate(F1_lobanov = (f1 - mean_F1_lobanov)/sd_F1_lobanov,
         F2_lobanov = (f2 - mean_F2_lobanov)/sd_F2_lobanov,
  #normalise with Lobanov 2.0
         F1_lobanov_2.0 = (f1 - mean_of_means_F1)/sd_of_means_F1,
         F2_lobanov_2.0 = (f2 - mean_of_means_F2)/sd_of_means_F2) %>%
  #remove the variables that are not required
  dplyr::select(-(mean_of_means_F1:sd_of_means_F2), -(mean_F1_lobanov:sd_F2_lobanov))
  1. Save the normalised sequences and monophthongs
Click here to view code.
write.csv(sequencesall, here("Data", "openingsequences_normalised_nofilter.csv"))
write.csv(monophthongsall, here("Data", "monophthongsfinal.csv"))

4.1.4 Formant trajectory filtering

This section provides the code to filter the formant trajectories, as described in the §3.3.1 of the manuscript.

  1. Read in normalized sequences data if need be
Click here to view code.
sequences = read.csv(here("Data", "openingsequences_normalised_nofilter.csv"))
  1. Some data prep
Click here to view code.
sequences$participant_gender = as.factor(sequences$participant_gender)
sequences$category = as.factor(sequences$category)
sequences$sequence = as.factor(sequences$Target.vowelCluster)
sequences$stress = as.factor(sequences$stress)

sequences$category_gender = interaction(sequences$participant_gender, sequences$category)

sequences <- sequences %>%
  mutate(unique_id = paste(MatchId, time)) %>%
  filter(!duplicated(unique_id))
  1. Pivot the data frame
Click here to view code.
vowels <- sequences


vowels <- vowels %>%
  pivot_longer(
    cols = F1_lobanov_2.0:F2_lobanov_2.0, # Select the columns to turn into rows.
    names_to = "Formant", # Name the column to indicate if data is F1 or F2,
    values_to = "Frequency"
  )

vowels %>%
  head(100) %>%
  kable() %>%
  kable_styling(font_size = 11) %>%
  scroll_box(width = "100%")
  1. Some more data prep
Click here to view code.
vowels$Vowel = vowels$sequence

vowels$word = vowels$Target.word

vowels <- vowels %>%
  mutate(preceding = str_match(word, "(.*)[eiou]a")[,2] %>%
           str_extract("(wh|ng|[^:]{0,1}:*)$") %>% 
           str_remove_all(":") %>%
           factor(),
         following = str_match(word, "[eiou]a(.*)")[,2] %>%
           str_extract("^[-:]*(wh|ng|[^:]{0,1}:*)") %>% 
           str_remove_all("[-:]") %>%
           ifelse(.=="", 
                  After.Match %>%
                   str_to_lower() %>% 
                   str_extract("^([<>~?:\"' ]|-)*(wh|ng|.{0,1})") %>%
                   str_remove("[<>~?:\"' -]+") %>% 
                   paste0("$", .),
                 .) %>%
           factor(),
         time_left = exp(-(time-1)/1.5),
         time_right = exp(-(9-time)/1.5),
         duration = Target.vowelCluster.end - Target.vowelCluster.start,
         preceding_category_gender = paste(preceding, category_gender) %>% factor(),
         following_category_gender = paste(following, category_gender) %>% factor(),
         Speaker_f = factor(Speaker)
  ) %>%
  group_by(MatchId) %>%
  mutate(traj_start=time==min(time)) %>%
  ungroup()
  1. Filtering functions
Click here to view code.
# 1) trajectories that are too far away from everyone else


calculate_overall_deviation <- function (id, time, frequency) {
  #traj_ids <- unique(dat$MatchId)
  comp <- tibble(id, time, frequency) %>%
    pivot_wider(id_cols=id,
                names_from=time,
                values_from=frequency) %>%
    select(-id)
  means <- summarise(comp, across(everything(), ~ median(.x, na.rm=T))) %>%
    unlist() %>%
    tibble(time=as.numeric(names(.)),
           overall_mean=.) %>%
    arrange(time)
  #print(means)
  tibble(id, time, frequency) %>%
    left_join(means, by="time") %>%
    group_by(id) %>%
    mutate(dev = abs(mean(frequency - overall_mean))) %>%
    ungroup() %>%
    pull(dev) %>%
    return()
}



# 2) individual data points that represent too much of a jump

calculate_jumpiness <- function (id, time, frequency) {
  # fit qgam smooth to entire subset
  m <- qgam(frequency ~ s(time, k=9), tibble(time, frequency), qu=0.5)
  # extract smoothing parameter
  smo_pe <- m$sp
  # fit smooth to each traj with sp
  tibble(id, frequency, time) %>%
    group_by(id) %>%
    mutate(jumpiness = 
             abs(
               frequency - predict(
                gam(frequency ~ s(time,k=length(time),sp=smo_pe))
                )
             )
          ) %>%
    ungroup() %>%
    pull(jumpiness) %>%
    return()
}
  1. Filter all the categories / vowels / formants and make some plots of the filtered data
Click here to view code.
generate_preds <- function (dat, newdat, pred_type) {
  #cat(dat$Formant[1], dat$category[1], dat$participant_gender[1], "\n")
  if (pred_type == "gam") {
    predict(
      bam(Frequency ~ s(time, k=9),
          data=dat),
      newdata=newdat
    )
  } else {
    predict(
      qgam(Frequency ~ s(time, k=9),
          data=dat, qu=0.5),
      newdata=newdat
    )
  }
}

# we iterate through the vowels
for (v in unique(vowels$Vowel)) {
  # unfiltered data
  vdat <- filter(vowels, Vowel==v) %>%
    mutate(data_type="unfiltered")
  vdat_filtered <- vdat %>%
    # we filter separately within formant / category_gender
    group_by(Formant, category, participant_gender) %>%
    mutate(jump=calculate_jumpiness(MatchId, time, Frequency)) %>%
    #### PAR 1 here:
    # jump criterion = 1, which is in Lobanov space
    filter(jump < 1) %>%
    ungroup() %>%
    # we remove trajectories with 3 or fewer data points
    group_by(MatchId) %>%
    filter(n() > 3) %>%
    ungroup() %>%
    # we remove trajectories that are too far away from their
    # vowel / formant / category_gender group
    group_by(Formant, category, participant_gender) %>%
    mutate(dev=calculate_overall_deviation(MatchId, time, Frequency)) %>%
    #### PAR 2 here:
    # deviation criterion = 1.5, which is in Lobanov space
    filter(dev < 1.5) %>%
    ungroup() %>%
    mutate(data_type="filtered")
  vdat_all <- bind_rows(vdat, vdat_filtered)
  # generate gam / qgam models for filtered / unfiltered data
  vdat_all_gam <- vdat_all %>%  
    group_by(data_type, Formant, category, participant_gender) %>%
    nest() %>%
    mutate(pred=
             map(
               data,
               ~ tibble(time=1:9) %>%
                 mutate(Frequency =
                   generate_preds(
                     .x,
                     .,
                     pred_type="gam"
                   )
                 )
             )
    )
  vdat_all_qgam <- vdat_all %>%  
    group_by(data_type, Formant, category, participant_gender) %>%
    nest() %>%
    mutate(pred=
             map(
               data,
               ~ tibble(time=1:9) %>%
                 mutate(Frequency =
                   generate_preds(
                     .x,
                     .,
                     pred_type="qgam"
                   )
                 )
             )
    )
  v_gam_preds <- bind_rows(
    vdat_all_gam %>%
      select(-data) %>%
      unnest() %>%
      mutate(pred_type="gam"),
    vdat_all_qgam %>%
      select(-data) %>%
      unnest() %>%
      mutate(pred_type="qgam"),
  )
 pdf(here::here("Figures", "Plots", "FilteredData", "Formants", paste0(v, ".pdf")), onefile = TRUE)
  for (f in unique(vdat_all$Formant)) {
    for (g in unique(vdat_all$participant_gender)) {
      gp <- ggplot(filter(vdat_all, Formant==f, participant_gender==g),
             aes(x=time, y=Frequency)) +
        facet_grid(category ~ data_type) +
        geom_line(aes(group=MatchId), col="black", lwd=0.1, alpha=0.2) +
        geom_line(data=filter(v_gam_preds, Formant==f, participant_gender==g),
                  aes(col=pred_type), lwd=1) +
        scale_colour_manual(values=c("blue","red")) +
        ggtitle(paste(f, g)) +
  theme(legend.position = "none")
      print(gp)
    }
  }
     #write csv of filtered data
  for (f in unique(vdat_filtered$Formant)) {
    file_name <- here("Plots","Filtered", "Formants", paste0(f, ".csv"))
    write.csv(vdat_filtered, file = file_name, row.names = FALSE)
  }
  
  
  dev.off()
}
  1. Combine filtered formants data
Click here to view code.
formants_filtered_ea <- read.csv(here("Data", "Filtered", "Formants", "ea.csv"))
formants_filtered_ia <- read.csv(here("Data", "Filtered", "Formants", "ia.csv"))
formants_filtered_oa <- read.csv(here("Data", "Filtered", "Formants", "oa.csv"))
formants_filtered_ua <- read.csv(here("Data", "Filtered", "Formants", "ua.csv"))

formants_filtered_all  <- rbind(formants_filtered_ea, formants_filtered_ia, formants_filtered_oa, formants_filtered_ua)

write.csv(formants_filtered_all, here("Data", "formants_filtered_all.csv"))

4.2 Pitch and Intensity (Manuscript §3.3.2)

The following code extracts praat measurements for pitch and intensity. As for the formant measurements, it requires a LaBB-CAT account. Chunks are set not to evaluate, measurements can be read in from provided csvs below.

4.2.1 Measurements

  1. Define URL + intervals, separate data by sequence
Click here to view code.
url <- "https://labbcat.canterbury.ac.nz/maonze/"
intervals <- c(.2,.3,.4, .5, .6, .7, .8)

ia = data_filtered %>% filter(Target.vowelCluster == "ia")  
ua = data_filtered %>% filter(Target.vowelCluster == "ua") 
oa = data_filtered %>% filter(Target.vowelCluster == "oa") 
ea = data_filtered %>% filter(Target.vowelCluster == "ea") 
  1. /ia/ pitch and intensity measurements
Click here to view code.
iapitch <- ia  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.vowelCluster.start,
    Target.vowelCluster.end,
    window.offset=0.025,
  paste(
      praatScriptPitch(gender.attribute = "participant_gender",
        value.for.male = "M",
         pitch.floor.male = 30,
        sample.points = intervals,
                           get.mean=TRUE),
      praatScriptIntensity(sample.points = intervals)))) %>%
  rename()

write.csv(iapitch, here("Data", "iaPitchIntRaw.csv"))
  1. /ea/ pitch and intensity measurements
Click here to view code.
eapitch <- 
ea  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.vowelCluster.start,
    Target.vowelCluster.end,
    window.offset=0.025,
  paste(
      praatScriptPitch(gender.attribute = "participant_gender",
        value.for.male = "M",
        pitch.floor.male = 30,
      sample.points = intervals,
                           get.mean=TRUE,),
      praatScriptIntensity(sample.points = intervals
                           )))) %>%
  rename()
    
write.csv(eapitch, here("Data", "eaPitchIntRaw.csv"))
  1. /oa/ pitch and intensity measurements
Click here to view code.
oapitch <-oa  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.vowelCluster.start,
    Target.vowelCluster.end,
    window.offset=0.025,
  paste(
      praatScriptPitch(gender.attribute = "participant_gender",
        value.for.male = "M",
         pitch.floor.male = 30,
        sample.points = intervals,
                           get.mean=TRUE),
      praatScriptIntensity(sample.points = intervals )))) %>%
  rename()
  
write.csv(oapitch, here("Data", "oaPitchIntRaw.csv"))  
  1. /ua/ pitch and intensity measurements
Click here to view code.
uapitch <- ua  %>%
    mutate(nzilbb.labbcat::processWithPraat(
    url,
    MatchId,
    Target.vowelCluster.start,
    Target.vowelCluster.end,
    window.offset=0.025,
  paste(
      praatScriptPitch(gender.attribute = "participant_gender",
        value.for.male = "M",
         pitch.floor.male = 30,
        sample.points = intervals,
                           get.mean=TRUE),
      praatScriptIntensity(sample.points = intervals )))) %>%
  rename()
  
write.csv(uapitch, here("Data", "uaPitchIntRaw.csv"))  
  1. Read in data if need be
Click here to view code.
iapitch <- read.csv(here("Data", "iaPitchIntRaw.csv"))
eapitch <- read.csv(here("Data", "eaPitchIntRaw.csv"))
oapitch <- read.csv(here("Data","oaPitchIntRaw.csv"))
uapitch <- read.csv(here("Data","uaPitchIntRaw.csv"))
  1. Create combined data frame
Click here to view code.
allpitch = rbind(iapitch,eapitch,oapitch,uapitch)
  1. Make separate data frames for pitch and intensity, pivot longer
Click here to view code.
allpitch = allpitch %>% mutate_at(c("intensity_time_0_2","intensity_time_0_3","intensity_time_0_4","intensity_time_0_5","intensity_time_0_6","intensity_time_0_7","intensity_time_0_8","pitch_time_0_2","pitch_time_0_3","pitch_time_0_4","pitch_time_0_5","pitch_time_0_6","pitch_time_0_7","pitch_time_0_8"), as.numeric)

  allintenselong =  allpitch %>% pivot_longer(c(intensity_time_0_2,intensity_time_0_3,intensity_time_0_4,intensity_time_0_5,intensity_time_0_6,intensity_time_0_7,intensity_time_0_8), names_to = "intensitytime", values_to = "intensity") 

  allpitchlong =  allpitch %>% pivot_longer(c(pitch_time_0_2,pitch_time_0_3, pitch_time_0_4,pitch_time_0_5,pitch_time_0_6,pitch_time_0_7,pitch_time_0_8),
               names_to = "pitchtime",
               values_to = "pitch")
  
 pitchintenselong = allpitchlong[,c("MatchId", "sequence", "Speaker", "participant_gender", "category", "pitchtime", "pitch", "complex")]
 pitchintenselong$temptime =  pitchintenselong$pitchtime
 pitchintenselong$time = as.numeric(substr( pitchintenselong$temptime, 14,14))
 pitchintenselong$pitch = allpitchlong$pitch
pitchintenselong$intensity = allintenselong$intensity
  1. Remove NAs
Click here to view code.
pitchintenselong <- pitchintenselong %>% 
    drop_na(pitch)  

pitchintenselong <- pitchintenselong %>% 
    drop_na(intensity)
  1. Write csv for long, uncentered data (not strictly necessary, but good to have)
Click here to view code.
write.csv(pitchintenselong, here("Data", "pitchlongall_uncentered.csv"))
  1. Split up pitch and intensity
Click here to view code.
 int <- pitchintenselong %>% 
   select(-pitch)


 pitch <- pitchintenselong %>% 
   select(-intensity)
  1. Centre data within speaker, save .csvs
Click here to view code.
pitch <- pitch %>% group_by(Speaker) %>%
    mutate(c_pitch = scale(pitch, center=TRUE, scale=FALSE))


int <- int %>% group_by(Speaker) %>%
  mutate(c_intensity = scale(intensity, center=TRUE, scale=FALSE))


write.csv(pitch, here("Data", "pitch_centered_per_speaker_nofilter.csv"))

write.csv(int, here("Data", "intcentered_per_speaker.csv"))

4.3 Pitch and Intensity filtering

This section provides the code to filter the pitch and intensity trajectories, as described in §3.3.2 of the manuscript.

  1. Read in data
Click here to view code.
pitch <- read.csv(here("Data","pitch_centered_per_speaker_nofilter.csv"))
int <- read.csv(here("Data","intcentered_per_speaker.csv"))

sequences <- read.csv(here("Data", "opening_seqs_selected_data.csv"))
  1. Some data prep
Click here to view code.
sequences$category_gender = interaction(sequences$participant_gender, sequences$category)


sequences_info <- sequences %>% 
  select(MatchId,  Speaker, Target.word, After.Match, category, participant_gender, category_gender, Target.vowelCluster.end, Target.vowelCluster.start) %>% 
  unique()
  1. Manually filter out pitch measurement errors
Click here to view code.
pitch <- pitch %>% 
 rename(raw_pitch = pitch)

filtered_women <- pitch %>% 
  filter(participant_gender == "F") %>% 
 filter(raw_pitch >=  70 & raw_pitch <=  460)  


filtered_men <- pitch %>% 
  filter(participant_gender == "M") %>% 
  filter(raw_pitch >=  60 & raw_pitch <= 230) 

 
 pitch_filtered <- rbind(filtered_women, filtered_men) 
  1. Some more data prep
Click here to view code.
pitch = pitch_filtered %>%
   dplyr::select(sequence,MatchId,
                 time,
                 pitch=c_pitch) 

int = int %>%
   dplyr::select(sequence,MatchId,
                 time,
                  intensity=c_intensity)


pitch <- left_join(pitch, sequences_info)

int <- left_join(int, sequences_info)


pitch <- pitch %>%
  mutate(unique_id = paste(MatchId, time)) %>%
  filter(!duplicated(unique_id)) %>% 
  drop_na()


int <- int %>%
  mutate(unique_id = paste(MatchId, time)) %>%
  filter(!duplicated(unique_id)) %>% 
  drop_na()


pitch$participant_gender = as.factor(pitch$participant_gender)
pitch$category = as.factor(pitch$category)
pitch$sequence = as.factor(pitch$sequence)
pitch$MatchId = as.factor(pitch$MatchId)

int$participant_gender = as.factor(int$participant_gender)
int$category = as.factor(int$category)
int$sequence = as.factor(int$sequence)
int$MatchId = as.factor(int$MatchId)

4.3.1 Pitch trajectory filtering

  1. Pivot the data frame
Click here to view code.
vowels <- pitch %>%
  pivot_longer(
    cols = pitch, # Select the columns to turn into rows.
    names_to = "MeasureType", # Name the column to indicate if data is pitch or intensity
    values_to = "Measure"
  )


is.numeric(vowels$Measure)



vowels %>%
  head(100) %>%
  kable() %>%
  kable_styling(font_size = 11) %>%
  scroll_box(width = "100%")
  1. Some more data prep
Click here to view code.
vowels$Vowel = vowels$sequence

vowels$word = vowels$Target.word

vowels <- vowels %>%
  mutate(preceding = str_match(word, "(.*)[eiou]a")[,2] %>%
           str_extract("(wh|ng|[^:]{0,1}:*)$") %>% 
           str_remove_all(":") %>%
           factor(),
         following = str_match(word, "[eiou]a(.*)")[,2] %>%
           str_extract("^[-:]*(wh|ng|[^:]{0,1}:*)") %>% 
           str_remove_all("[-:]") %>%
           ifelse(.=="", 
                  After.Match %>%
                   str_to_lower() %>% 
                   str_extract("^([<>~?:\"' ]|-)*(wh|ng|.{0,1})") %>%
                   str_remove("[<>~?:\"' -]+") %>% 
                   paste0("$", .),
                 .) %>%
           factor(),
         time_left = exp(-(time-1)/1.5),
         time_right = exp(-(9-time)/1.5),
         duration = Target.vowelCluster.end - Target.vowelCluster.start,
         preceding_category_gender = paste(preceding, category_gender) %>% factor(),
         following_category_gender = paste(following, category_gender) %>% factor(),
         Speaker_f = factor(Speaker)
  ) %>%
  group_by(MatchId) %>%
  mutate(traj_start=time==min(time)) %>%
  ungroup()

vowels <- vowels %>% 
  drop_na()
  1. Filtering functions
Click here to view code.
# 1) trajectories that are too far away from everyone else

calculate_overall_deviation <- function (id, time, Measure) {
  #traj_ids <- unique(dat$MatchId)
  comp <- tibble(id, time, Measure) %>%
    pivot_wider(id_cols=id,
                names_from=time,
                values_from=Measure) %>%
    select(-id)
  means <- summarise(comp, across(everything(), ~ median(.x, na.rm=T))) %>%
    unlist()
  tibble(id, time, Measure) %>%
    group_by(id) %>%
    mutate(dev = abs(mean(Measure - means[time]))) %>%
    ungroup() %>%
    pull(dev) %>%
    return()
}

# 2) individual data points that represent too much of a jump

calculate_jumpiness <- function (id, time, Measure) {
  # fit qgam smooth to entire subset
  m <- qgam(Measure ~ s(time, k=4), tibble(time, Measure), qu=0.5)
  # extract smoothing parameter
  smo_pe <- m$sp
  # fit smooth to each traj with sp
  tibble(id, Measure, time) %>%
    group_by(id) %>%
    mutate(jumpiness = 
             abs(
               Measure - predict(
                gam(Measure ~ s(time,k=length(time),sp=smo_pe))
                )
             )
          ) %>%
    ungroup() %>%
    pull(jumpiness) %>%
    return()
}
  1. Filter pitch trajectories for all the categories and vowels, and make some plots of the filtered data
Click here to view code.
generate_preds <- function (dat, newdat, pred_type) {
  #cat(dat$Formant[1], dat$category[1], dat$participant_gender[1], "\n")
  if (pred_type == "gam") {
    predict(
      bam(Measure ~ s(time, k=5),
          data=dat),
      newdata=newdat
    )
  } else {
    predict(
      qgam(Measure ~ s(time, k=5),
          data=dat, qu=0.5),
      newdata=newdat
    )
  }
}

# we iterate through the vowels
for (v in unique(vowels$Vowel)) {
  # unfiltered data
  vdat <- filter(vowels, Vowel==v) %>%
    mutate(data_type="unfiltered")
  vdat_filtered <- vdat %>%
    # we remove trajectories with 3 or fewer data points
    group_by(MatchId) %>%
    filter(n() > 3) %>%
    ungroup() %>%
    # we filter separately within formant / category_gender
    group_by(MeasureType, category, participant_gender) %>%
    mutate(jump=calculate_jumpiness(MatchId, time, Measure)) %>%
    #### PAR 1 here:
    # jump criterion  
    filter(jump < 100) %>%
    ungroup() %>%
    mutate(data_type="filtered") 
  vdat_all <- bind_rows(vdat, vdat_filtered)
  # generate gam / qgam models for filtered / unfiltered data
  vdat_all_gam <- vdat_all %>%  
    group_by(data_type, MeasureType, category, participant_gender) %>%
    nest() %>%
    mutate(pred=
             map(
               data,
               ~ tibble(time=2:8) %>%
                 mutate(Measure =
                   generate_preds(
                     .x,
                     .,
                     pred_type="gam"
                   )
                 )
             )
    )
  vdat_all_qgam <- vdat_all %>%  
    group_by(data_type, MeasureType, category, participant_gender) %>%
    nest() %>%
    mutate(pred=
             map(
               data,
               ~ tibble(time=2:8) %>%
                 mutate(Measure =
                   generate_preds(
                     .x,
                     .,
                     pred_type="qgam"
                   )
                 )
             )
    )
  v_gam_preds <- bind_rows(
    vdat_all_gam %>%
      select(-data) %>%
      unnest() %>%
      mutate(pred_type="gam"),
    vdat_all_qgam %>%
      select(-data) %>%
      unnest() %>%
      mutate(pred_type="qgam"),
  )
 pdf(here::here("Figures", "Plots", "FilteredData", "Pitch", paste0(v, ".pdf")), onefile = TRUE)
  for (f in unique(vdat_all$MeasureType)) {
    for (g in unique(vdat_all$participant_gender)) {
      gp <- ggplot(filter(vdat_all, MeasureType==f, participant_gender==g),
             aes(x=time, y=Measure)) +
        facet_grid(category ~ data_type) +
        geom_line(aes(group=MatchId), col="black", lwd=0.1, alpha=0.2) +
        geom_line(data=filter(v_gam_preds, MeasureType==f, participant_gender==g),
                  aes(col=pred_type), lwd=1) +
        scale_colour_manual(values=c("blue","red")) +
        ggtitle(paste(f, g))
      print(gp)
    }
  }
     #write csv of filtered data
  for (f in unique(vdat_filtered$Measure)) {
    file_name <- here("Plots", "Filtered", "Pitch", paste0(v, ".csv"))
    write.csv(vdat_filtered, file = file_name, row.names = FALSE)
  }
  
  dev.off()
}

4.3.2 Intensity trajectory filtering

  1. Pivot the data
Click here to view code.
vowels <- int %>%
  pivot_longer(
    cols = intensity, # Select the columns to turn into rows.
    names_to = "MeasureType", # Name the column to indicate if data is pitch or intensity
    values_to = "Measure"
  )


is.numeric(vowels$Measure)



vowels %>%
  head(100) %>%
  kable() %>%
  kable_styling(font_size = 11) %>%
  scroll_box(width = "100%")
  1. Some more data prep
Click here to view code.
vowels$Vowel = vowels$sequence

vowels$word = vowels$Target.word

vowels <- vowels %>%
  mutate(preceding = str_match(word, "(.*)[eiou]a")[,2] %>%
           str_extract("(wh|ng|[^:]{0,1}:*)$") %>% 
           str_remove_all(":") %>%
           factor(),
         following = str_match(word, "[eiou]a(.*)")[,2] %>%
           str_extract("^[-:]*(wh|ng|[^:]{0,1}:*)") %>% 
           str_remove_all("[-:]") %>%
           ifelse(.=="", 
                  After.Match %>%
                   str_to_lower() %>% 
                   str_extract("^([<>~?:\"' ]|-)*(wh|ng|.{0,1})") %>%
                   str_remove("[<>~?:\"' -]+") %>% 
                   paste0("$", .),
                 .) %>%
           factor(),
         time_left = exp(-(time-1)/1.5),
         time_right = exp(-(9-time)/1.5),
         duration = Target.vowelCluster.end - Target.vowelCluster.start,
         preceding_category_gender = paste(preceding, category_gender) %>% factor(),
         following_category_gender = paste(following, category_gender) %>% factor(),
         Speaker_f = factor(Speaker)
  ) %>%
  group_by(MatchId) %>%
  mutate(traj_start=time==min(time)) %>%
  ungroup()


vowels <- vowels %>% 
  drop_na()
  1. Filtering functions
Click here to view code.
# 1) trajectories that are too far away from everyone else

calculate_overall_deviation <- function (id, time, Measure) {
  #traj_ids <- unique(dat$MatchId)
  comp <- tibble(id, time, Measure) %>%
    pivot_wider(id_cols=id,
                names_from=time,
                values_from=Measure) %>%
    select(-id)
  means <- summarise(comp, across(everything(), ~ median(.x, na.rm=T))) %>%
    unlist() %>%
    tibble(time=as.numeric(names(.)),
           overall_mean=.) %>%
    arrange(time)
  #print(means)
  tibble(id, time, Measure) %>%
    left_join(means, by="time") %>%
    group_by(id) %>%
    mutate(dev = abs(mean(Measure - overall_mean))) %>%
    ungroup() %>%
    pull(dev) %>%
    return()
}

# 2) individual data points that represent too much of a jump


calculate_jumpiness <- function (id, time, Measure) {
  # fit qgam smooth to entire subset
  m <- qgam(Measure ~ s(time, k=4), tibble(time, Measure), qu=0.5)
  # extract smoothing parameter
  smo_pe <- m$sp
  # fit smooth to each traj with sp
  tibble(id, Measure, time) %>%
    group_by(id) %>%
    mutate(jumpiness = 
             abs(
               Measure - predict(
                gam(Measure ~ s(time,k=length(time),sp=smo_pe))
                )
             )
          ) %>%
    ungroup() %>%
    pull(jumpiness) %>%
    return()
}
  1. Filter intensity trajectories for all the categories and vowels, and make some plots of the filtered data
Click here to view code.
generate_preds <- function (dat, newdat, pred_type) {
  #cat(dat$Formant[1], dat$category[1], dat$participant_gender[1], "\n")
  if (pred_type == "gam") {
    predict(
      bam(Measure ~ s(time, k=6),
          data=dat),
      newdata=newdat
    )
  } else {
    predict(
      qgam(Measure ~ s(time, k=6),
          data=dat, qu=0.5),
      newdata=newdat
    )
  }
}

# we iterate through the vowels
for (v in unique(vowels$Vowel)) {
  # unfiltered data
  vdat <- filter(vowels, Vowel==v) %>%
    mutate(data_type="unfiltered")
  vdat_filtered <- vdat %>%
     # we remove trajectories with 3 or fewer data points
    group_by(MatchId) %>%
    filter(n() > 3) %>%
    ungroup() %>%
    # we filter separately within formant / category_gender
    group_by(MeasureType, category, participant_gender) %>%
  mutate(jump=calculate_jumpiness(MatchId, time, Measure)) %>%
    #### PAR 1 here:
    # jump criterion =  
    filter(jump < 15) %>%
    ungroup() %>%
    # we remove trajectories that are too far away from their
    # vowel / formant / category_gender group
   group_by(MeasureType, category, participant_gender) %>%
    mutate(dev=calculate_overall_deviation(MatchId, time, Measure)) %>%
    #### PAR 2 here:
   #  deviation criterion = 
    filter(dev < 15) %>%
   ungroup() %>%
    mutate(data_type="filtered")
  vdat_all <- bind_rows(vdat, vdat_filtered)
  # generate gam / qgam models for filtered / unfiltered data
  vdat_all_gam <- vdat_all %>%  
    group_by(data_type, MeasureType, category, participant_gender) %>%
    nest() %>%
    mutate(pred=
             map(
               data,
               ~ tibble(time=2:8) %>%
                 mutate(Measure =
                   generate_preds(
                     .x,
                     .,
                     pred_type="gam"
                   )
                 )
             )
    )
  vdat_all_qgam <- vdat_all %>%  
    group_by(data_type, MeasureType, category, participant_gender) %>%
    nest() %>%
    mutate(pred=
             map(
               data,
               ~ tibble(time=2:8) %>%
                 mutate(Measure =
                   generate_preds(
                     .x,
                     .,
                     pred_type="qgam"
                   )
                 )
             )
    )
  v_gam_preds <- bind_rows(
    vdat_all_gam %>%
      select(-data) %>%
      unnest() %>%
      mutate(pred_type="gam"),
    vdat_all_qgam %>%
      select(-data) %>%
      unnest() %>%
      mutate(pred_type="qgam"),
  )
  pdf(here::here("Figures", "Plots", "FilteredData", "Int", paste0(v, ".pdf")), onefile = TRUE)
  for (f in unique(vdat_all$MeasureType)) {
    for (g in unique(vdat_all$participant_gender)) {
      gp <- ggplot(filter(vdat_all, MeasureType==f, participant_gender==g),
             aes(x=time, y=Measure)) +
        facet_grid(category ~ data_type) +
        geom_line(aes(group=MatchId), col="black", lwd=0.1, alpha=0.2) +
        geom_line(data=filter(v_gam_preds, MeasureType==f, participant_gender==g),
                  aes(col=pred_type), lwd=1) +
        scale_colour_manual(values=c("blue","red")) +
        ggtitle(paste(f, g))
      print(gp)
    }
  }
     #write csv of filtered data
  for (f in unique(vdat_filtered$Measure)) {
    file_name <- here("Plots", "Filtered", "Int", paste0(v, ".csv"))
    write.csv(vdat_filtered, file = file_name, row.names = FALSE)
  }
  
  dev.off()
}

4.3.3 Combine filtered data

  1. Read data in if need be
Click here to view code.
pitch_filtered_ea <- read.csv(here("Data", "Filtered", "Pitch", "ea.csv"))
pitch_filtered_ia <- read.csv(here("Data", "Filtered", "Pitch", "ia.csv"))
pitch_filtered_oa <- read.csv(here("Data", "Filtered", "Pitch", "oa.csv"))
pitch_filtered_ua <- read.csv(here("Data", "Filtered", "Pitch", "ua.csv"))

int_filtered_ea <- read.csv(here("Data", "Filtered", "Int", "ea.csv"))
int_filtered_ia <- read.csv(here("Data", "Filtered", "Int", "ia.csv"))
int_filtered_oa <- read.csv(here("Data", "Filtered", "Int", "oa.csv"))
int_filtered_ua <- read.csv(here("Data", "Filtered", "Int", "ua.csv"))
  1. Create combined data frames
Click here to view code.
pitch_filtered_all  <- rbind(pitch_filtered_ea, pitch_filtered_ia, pitch_filtered_oa, pitch_filtered_ua)

int_filtered_all  <- rbind(int_filtered_ea, int_filtered_ia, int_filtered_oa, int_filtered_ua)
  1. Write .csvs of filtered data
Click here to view code.
write.csv(pitch_filtered_all, here("Data", "pitch_filtered.csv"))
write.csv(int_filtered_all, here("Data", "int_filtered.csv"))

5 Data exploration: how many trajectories and time points were lost in the filtering process?

5.1 Formants: missing trajectories

  1. Read in filtered formant trajectories if need be
Click here to view code.
formants_filtered_all <- read.csv(here("Data", "formants_filtered_all.csv"))
  1. Label tokens which are included in the filtered data set
Click here to view code.
filtered_formants_ids <-   formants_filtered_all %>% 
  select(MatchId) %>% 
  mutate(included_formants = "yes") %>% 
  unique()
  1. Get MatchIds for all tokens, combine with the ids for the filtered data set. Label tokens not included in the filtered data set
Click here to view code.
sequences <- read.csv(here("Data", "opening_seqs_selected_data.csv"))

all_formants_ids <- sequences %>% 
   select(MatchId) %>% 
unique() 

all_formants_ids <- all_formants_ids %>% 
  left_join(filtered_formants_ids) %>% 
  mutate(included_formants = replace_na(included_formants, "no"))
  1. Count number of tokens included and excluded
Click here to view code.
formants_filtered_summary <- all_formants_ids %>% 
  group_by(included_formants) %>% 
  count()

5.2 Formants: missing time points

  1. Group trajectories by number of time points
Click here to view code.
filtered_formants_time_points <- formants_filtered_all %>% 
  select(MatchId, time, category, Formant)  %>% 
   unique() %>% 
   group_by(category, Formant, MatchId) %>%
summarise(n_timepoints = n_distinct(time), .groups = "drop") %>%
  mutate(bucket = case_when(
    n_timepoints <= 4 ~ "≤4",
    n_timepoints == 5 ~ "5",
    n_timepoints == 6 ~ "6",
    n_timepoints == 7 ~ "7",
    n_timepoints == 8 ~ "8",
    n_timepoints == 9 ~ "9"
  )) %>%
  count(category, Formant, bucket)
  1. Calculate what percentage of trajectories have fewer than 4 timepoints
Click here to view code.
filtered_formants_time_points_overall <- formants_filtered_all %>% 
  select(MatchId, time, Formant)  %>% 
   group_by(Formant, MatchId) %>%
 summarise(n_timepoints = n_distinct(time), .groups = "drop") %>%
  group_by(Formant) %>%
  summarise(
    total_matches = n(),
    fewer_than_4 = sum(n_timepoints <= 4),
    pecentage_fewer_than_4 = fewer_than_4 / total_matches * 100,
    all_9  = sum(n_timepoints == 9),
    pecentage_all_9 = all_9 / total_matches * 100,
  )

5.3 Intensity: missing trajectories

  1. Read in filtered intensity trajectories if need be
Click here to view code.
 int_filtered_all <- read.csv(here("Data", "int_filtered.csv"))
  1. Label tokens which are included in the filtered data set
Click here to view code.
filtered_int_ids <-   int_filtered_all %>% 
  select(MatchId) %>% 
  mutate(included_int = "yes") %>% 
  unique()
  1. Get MatchIds for all tokens, combine with the ids for the filtered data set. Label tokens not included in the filtered data set
Click here to view code.
all_int_ids <- int %>% 
   select(MatchId) %>% 
unique() 

all_int_ids <- all_int_ids %>% 
  left_join(filtered_int_ids) %>% 
  mutate(included_int = replace_na(included_int, "no"))
  1. Count number of tokens included and excluded
int_filtered_summary <- all_int_ids %>% 
  group_by(included_int) %>% 
  count()

5.4 Intensity: missing time points

  1. Group trajectories by number of time points
Click here to view code.
filtered_int_time_points <- int_filtered_all %>% 
  select(MatchId, time, category)  %>% 
   group_by(category, MatchId) %>%
summarise(n_timepoints = n_distinct(time), .groups = "drop_last") %>%
  mutate(bucket = case_when(
     n_timepoints <= 3 ~ "≤3",
    n_timepoints == 4 ~ "4",
    n_timepoints == 5 ~ "5",
    n_timepoints == 6 ~ "6",
    n_timepoints == 7 ~ "7",
    n_timepoints == 8 ~ "8",
    n_timepoints == 9 ~ "9"
  )) %>%
  count(category, bucket)
  1. Calculate what percentage of trajectories have fewer than 4 timepoints
Click here to view code.
filtered_int_time_points_overall <- int_filtered_all %>% 
  select(MatchId, time,)  %>% 
   group_by(MatchId) %>%
 summarise(n_timepoints = n_distinct(time), .groups = "drop_last") %>%
  summarise(
    total_matches = n(),
    fewer_than_4 = sum(n_timepoints <= 4),
    pecentage_fewer_than_4 = fewer_than_4 / total_matches * 100,
    all_7  = sum(n_timepoints == 7),
    pecentage_all_7 = all_7 / total_matches * 100,
  )

5.5 Pitch: missing trajectories

  1. Read in filtered pitch trajectories if need be
Click here to view code.
pitch_filtered_all <- read.csv(here("Data", "pitch_filtered.csv"))
  1. Label tokens which are included in the filtered data set
Click here to view code.
filtered_pitch_ids <-   pitch_filtered_all %>% 
  select(MatchId) %>% 
  mutate(included_pitch = "yes") %>% 
  unique()
  1. Get MatchIds for all tokens, combine with the ids for the filtered data set. Label tokens not included in the filtered data set
Click here to view code.
all_pitch_ids <- pitch %>% 
   select(MatchId) %>% 
unique() 

all_pitch_ids <- all_pitch_ids %>% 
  left_join(filtered_pitch_ids) %>% 
  mutate(included_pitch = replace_na(included_pitch, "no"))
  1. Count number of tokens included and excluded
Click here to view code.
pitch_filtered_summary <- all_pitch_ids %>% 
  group_by(included_pitch) %>% 
  count()

5.6 Pitch: missing time points

  1. Group trajectories by number of time points
Click here to view code.
filtered_pitch_time_points <- pitch_filtered_all %>% 
  select(MatchId, time, category)  %>% 
   group_by(category, MatchId) %>%
summarise(n_timepoints = n_distinct(time), .groups = "drop_last") %>%
  mutate(bucket = case_when(
    n_timepoints <= 4 ~ "≤4",
    n_timepoints == 5 ~ "5",
    n_timepoints == 6 ~ "6",
    n_timepoints == 7 ~ "7",
    n_timepoints == 8 ~ "8",
    n_timepoints == 9 ~ "9"
  )) %>%
  count(category, bucket)
  1. Calculate what percentage of trajectories have fewer than 4 timepoints
Click here to view code.
filtered_pitch_time_points_overall <- pitch_filtered_all %>% 
  select(MatchId, time,)  %>% 
   group_by(MatchId) %>%
 summarise(n_timepoints = n_distinct(time), .groups = "drop_last") %>%
  summarise(
    total_matches = n(),
    fewer_than_4 = sum(n_timepoints <= 4),
    pecentage_fewer_than_4 = fewer_than_4 / total_matches * 100,
    all_7  = sum(n_timepoints == 7),
    pecentage_all_7 = all_7 / total_matches * 100,
  )
Click here to view code.
all_filtered_info <- all_formants_ids %>% 
  left_join(all_int_ids, by = "MatchId") %>% 
  left_join(all_pitch_ids, by = "MatchId")

all_filtered_info %>% 
  group_by(included_formants, included_int, included_pitch) %>% 
  count()
# A tibble: 10 × 4
# Groups:   included_formants, included_int, included_pitch [10]
   included_formants included_int included_pitch     n
   <chr>             <chr>        <chr>          <int>
 1 no                no           no                11
 2 no                no           yes               10
 3 no                yes          no                 3
 4 no                yes          yes               51
 5 no                <NA>         <NA>              83
 6 yes               no           no               935
 7 yes               no           yes              108
 8 yes               yes          no               334
 9 yes               yes          yes            11710
10 yes               <NA>         <NA>             676

5.7 What relationship is there between trajectories with measurement points missing and forced alignment errors?

  1. Read information about forced alignment errors
Click here to view code.
forced_align_errors <- read.csv(here("Data", "duration_URLs.csv")) %>% 
  select(MatchId, error)
  1. Label formant trajectory tokens for whether there is a forced alignment error
Click here to view code.
formants_filtered_all <- left_join(formants_filtered_all, forced_align_errors) %>% 
   mutate(error = ifelse(is.na(error) | error == "", "n", error))
  1. Count n time points for tokens with and without forced alignment errors
Click here to view code.
filtered_formants_time_points_forcedalign <- formants_filtered_all %>% 
  select(MatchId, time, error, Formant)  %>% 
   unique() %>% 
   group_by(error, Formant, MatchId) %>%
summarise(n_timepoints = n_distinct(time), .groups = "drop") %>%
  mutate(bucket = case_when(
    n_timepoints <= 4 ~ "≤4",
    n_timepoints == 5 ~ "5",
    n_timepoints == 6 ~ "6",
    n_timepoints == 7 ~ "7",
    n_timepoints == 8 ~ "8",
    n_timepoints == 9 ~ "9"
  )) %>%
  count(error, Formant, bucket)
  1. Same for intensity
Click here to view code.
int_filtered_all <- left_join(int_filtered_all, forced_align_errors) %>% 
   mutate(error = ifelse(is.na(error) | error == "", "n", error))

filtered_int_time_points_forcedalign <- int_filtered_all %>% 
  select(MatchId, time, error)  %>% 
   group_by(error, MatchId) %>%
summarise(n_timepoints = n_distinct(time), .groups = "drop_last") %>%
  mutate(bucket = case_when(
     n_timepoints <= 3 ~ "≤3",
    n_timepoints == 4 ~ "4",
    n_timepoints == 5 ~ "5",
    n_timepoints == 6 ~ "6",
    n_timepoints == 7 ~ "7",
    n_timepoints == 8 ~ "8",
    n_timepoints == 9 ~ "9"
  )) %>%
  count(error, bucket)
  1. Same for pitch
Click here to view code.
pitch_filtered_all <- left_join(pitch_filtered_all, forced_align_errors) %>% 
   mutate(error = ifelse(is.na(error) | error == "", "n", error))


filtered_pitch_time_points_forcedalign <- pitch_filtered_all %>% 
  select(MatchId, time, error)  %>% 
   group_by(error, MatchId) %>%
summarise(n_timepoints = n_distinct(time), .groups = "drop_last") %>%
  mutate(bucket = case_when(
     n_timepoints <= 3 ~ "≤3",
    n_timepoints == 4 ~ "4",
    n_timepoints == 5 ~ "5",
    n_timepoints == 6 ~ "6",
    n_timepoints == 7 ~ "7",
    n_timepoints == 8 ~ "8",
    n_timepoints == 9 ~ "9"
  )) %>%
  count(error, bucket)

6 fPCA

  1. Load data files (if need be), rename various columns
Click here to view code.
formants_filtered <- read_csv(here("Data", "formants_filtered_all.csv")) %>% 
  dplyr::select(Vowel, MatchId, time, Formant, Frequency)

formants_wide <- formants_filtered %>% 
  pivot_wider(
    names_from = Formant,
    values_from = Frequency
  )  


formants_wide <- formants_wide %>% 
  rename(sequence = Vowel,
        form_time = time,
        f1=F1_lobanov_2.0,f2=F2_lobanov_2.0)

int_filtered <- read.csv(here("Data", "int_filtered.csv")) %>% 
  dplyr::select(Vowel, MatchId, time, Measure) %>% 
  rename(intensity = Measure,
         sequence = Vowel) 
 


pitch_filtered <- read.csv(here("Data", "pitch_filtered.csv")) %>% 
dplyr::select(Vowel, MatchId, time, Measure) %>% 
  rename(sequence = Vowel,
        pitch = Measure) 

pitch_intensity_data = left_join(int_filtered, pitch_filtered) %>% 
  rename(pitch_time = time)
  1. Define function for doing FPCAs for formants. This function performs fPCA for F1 and F2 separately, but does both at the same time for each sequence
Click here to view code.
PerformFPCA_Forms = function(diphthong,data_set){
  
  ## Get temporary working data set
  data_temp = get(data_set) %>% 
    dplyr::filter(sequence == diphthong)
  
  ## create FPCA inputs for each formant
  input_1 = MakeFPCAInputs(IDs=data_temp$MatchId,
                           tVec=data_temp$form_time,
                           yVec=data_temp$f1)
  input_2 = MakeFPCAInputs(IDs=data_temp$MatchId,
                           tVec=data_temp$form_time,
                           yVec=data_temp$f2)
  
  ## perform FPCA on inputs
  fpca_1 = FPCA(input_1$Ly, input_1$Lt )#optns=list(nRegGrid=9) #this specifies no of time points required   
  fpca_2 = FPCA(input_2$Ly, input_2$Lt) #optns=list(nRegGrid=9)
  
  ## create data frame to return
  data_return = data.frame(MatchId = unlist(matrix(input_1$Lid)),
                           sequence = diphthong,
                           f1_pc1 = fpca_1$xiEst[,1],
                           f1_pc2 = fpca_1$xiEst[,2],
                           f1_pc3 = fpca_1$xiEst[,3],
                           f2_pc1 = fpca_2$xiEst[,1],
                           f2_pc2 = fpca_2$xiEst[,2],
                           f2_pc3 = fpca_2$xiEst[,3])

  # create global variables as a list of two FPCA objects
  fpca_varname = paste("form_fpca_",diphthong,sep="")
  assign(fpca_varname,list(fpca_1,fpca_2),envir=.GlobalEnv)
  
  return(data_return)
}
  1. Run function fPCA for formants, then bind all the frames together

Note: when running, this warning comes up: !– In CheckData(Ly, Lt) : – !– There is a time gap of at least 10% of the observed range across subjects –

Which can be ignored, it just likes more “finely-grained” time series

Click here to view code.
formants_data <- unique(formants_wide) %>% 
  drop_na()

form_dataname = "formants_data"


  
data_form_ea = PerformFPCA_Forms("ea",form_dataname)
data_form_ia = PerformFPCA_Forms("ia",form_dataname)
data_form_oa = PerformFPCA_Forms("oa",form_dataname)
data_form_ua = PerformFPCA_Forms("ua",form_dataname)

merged_form = bind_rows(list(data_form_ea,data_form_ia,data_form_oa,data_form_ua))
  1. Function for performing fPCA for pitch and intensity
Click here to view code.
PerformFPCA_Pitch = function(diphthong,data_set){
  
  ## get temporary working data set
  data_temp = get(data_set) %>% 
    dplyr::filter(sequence == diphthong)
  
  ## create inputs for each formant
  input_1 = MakeFPCAInputs(IDs=data_temp$MatchId,
                           tVec=data_temp$pitch_time,
                           yVec=data_temp$pitch)
  input_2 = MakeFPCAInputs(IDs=data_temp$MatchId,
                           tVec=data_temp$pitch_time,
                           yVec=data_temp$intensity)
  
  ## perform FPCA on inputs
  fpca_1 = FPCA(input_1$Ly, input_1$Lt) #, optns=list(nRegGrid=7) 
  fpca_2 = FPCA(input_2$Ly, input_2$Lt) #optns=list(nRegGrid=7)

  ## create data frame to return
  data_return = data.frame(MatchId = unlist(matrix(input_1$Lid)),
                           sequence = diphthong,
                           pitch_pc1 = fpca_1$xiEst[,1],
                           pitch_pc2 = fpca_1$xiEst[,2],
                           pitch_pc3 = fpca_1$xiEst[,3],
                           intensity_pc1 = fpca_2$xiEst[,1],
                           intensity_pc2 = fpca_2$xiEst[,2],
                           intensity_pc3 = fpca_2$xiEst[,3])
  
  ## create global variables as a list of two FPCA objects
  fpca_varname = paste("pitch_fpca_",diphthong,sep="")
  assign(fpca_varname,list(fpca_1,fpca_2),envir=.GlobalEnv)
  
  return(data_return)
}
  1. Run fPCA for pitch and intensity
Click here to view code.
pitch_intensity_data<- unique(pitch_intensity_data) %>% 
    drop_na()

pint_dataname = "pitch_intensity_data"

data_pitch_ea = PerformFPCA_Pitch("ea",pint_dataname)
data_pitch_ia = PerformFPCA_Pitch("ia",pint_dataname)
data_pitch_oa = PerformFPCA_Pitch("oa",pint_dataname)
data_pitch_ua = PerformFPCA_Pitch("ua",pint_dataname)

merged_pitch = bind_rows(list(data_pitch_ea,data_pitch_ia,data_pitch_oa,data_pitch_ua))
  1. combine fPCA results into a single data frame and save
Click here to view code.
merged_big = merge(merged_form,merged_pitch,by=c("sequence","MatchId"))


write.csv(merged_big, here("Data", "fpca_merged.csv"), row.names = FALSE)

6.1 Plot fPCAs

The following plots show the effect of a given fPC curve when added or subtracted from the mean curve. These curves are weighted by the standard deviation of the scores for said fPC, the same method implemented in (Gubian, Torreira, and Boves 2015) and (Gubian et al. 2019). These plots allow us to see what high and low fPC scores correspond to in terms of the shape of the curve. The mean curve is shown as a thick black line, high fPC scores are indicated with a plus <+> and low fPC scores are indicated with a minus <->.

  1. Define function for plotting fPCAs
Click here to view code.
## MAIN FUNCTION: Generate a plot given a PC and formant (as integer ID)
PlotPCs = function(PC,fpca_type,sequence,fpca_name,flip_symbols=0){
  
  ## Create a working dataset
  working_fpca = get(paste(fpca_name,"_fpca_",sequence,sep=""))[[fpca_type]]
    
  ## get variables from FPCA output
  mean_curve = working_fpca$mu
  PC_curve = working_fpca$phi[,PC]
  PC_mod = PC_curve * sd(working_fpca$xiEst[,PC])
  cum_var = working_fpca$cumFVE
  
  if (fpca_name == "form"){
    time_start = 1
    time_end = 9
  } else {
    time_start = 2
    time_end = 8
  }
  
  ## send to "MorePoints" function, get finer detail curves
  mean_curve = MorePoints(mean_curve,time_start,time_end)
  PC_curve = MorePoints(PC_curve,time_start,time_end)
  PC_mod = MorePoints(PC_mod,time_start,time_end)
  
  FPCA_extract = data.frame(mean_curve,PC_curve,PC_mod)
  
  # get values for plot title and generate titles
  plot_cum_var = cum_var[PC]*100
  plot_PC_var = UnTotal(cum_var,PC)*100
  
  if (fpca_name == "form"){
    if (fpca_type == 1){
      plot_effect = "F1"
    } else {
      plot_effect = "F2"
    }
  } else {
    if (fpca_type == 1){
      plot_effect = "pitch"
    } else {
      plot_effect = "intensity"
    }
  }
  
  plot_title = sprintf("Effect of fPC%s on %s \n(Var: %.1f%% VarTotal: %.1f%%)",PC,plot_effect, plot_PC_var,plot_cum_var)
  
  if (fpca_name == "form"){
    # if formant, check which formant and adjust limits accordingly
    if (fpca_type == 1){
      y_min = -1.5
      y_max = 3.5 
    } else {
      y_min = -2.5
      y_max = 2.5
    }
      
  } else {
    # alternatively, if pitch/intensity...
    if (fpca_type == 1){
      y_min = -50
      y_max = 50
    } else {
      y_min = -12
      y_max = 7
    }
  }
  
  ## change y label to intensity if intensity is being examined
  if (fpca_name == "pitch" & fpca_type == 2){
    ylabel = "Normalised Intensity"
  } else {
    ylabel = "Normalised Frequency"
  }
  
  
  ## If "flip_symbols" parameter argument isn't false, flip plus and minus symbols
  if (flip_symbols == 0){
    add_symbol = "+"
    sub_symbol = "-"
  } else {
    add_symbol = "-"
    sub_symbol = "+"
  }
  
  PC_plot = ggplot(FPCA_extract, aes(x = seq(time_start,time_end,by=0.5))) +
    
    # plot curves
    geom_smooth(aes(y=mean_curve),se=FALSE,color="black") +
    geom_point(aes(y=mean_curve + PC_mod),
               shape=add_symbol,size=5) +
    geom_point(aes(y=mean_curve - PC_mod),
               shape=sub_symbol,size=5) +
    
    # format plot
    labs(x="Timepoint",y=ylabel,
         title=plot_title) +
    scale_x_continuous(breaks=seq(time_start,time_end,by=1)) + 
    theme_bw() + ylim(y_min,y_max) +
    theme(panel.grid = element_blank(),
          plot.title = element_text(hjust=0.5,size=12))
  
  return(PC_plot)
}

## SUPPORT FUNCTION: Given a specific curve, predict a finer-detail curve 

MorePoints = function(curve,time_start,time_end){
  times=time_start:time_end
  temp_smooth = loess(curve~times)
  temp_smoother = predict(temp_smooth,seq(time_start,time_end,by=0.5))
  return(temp_smoother)
}

## SUPPORT FUNCTION: Return non-cumulative variance contribution
# ('fdapace.FPCA()' objects contain cumulative variances, not individual PC variance)

UnTotal = function(vec,index){
  if (index == 1){
    return(vec[index])
  } else {
    new_vec = vec[index] - vec[index - 1]
    return(new_vec)
  }
}
  1. Create fPCA plots for formants, prints in a 3x2 grid.
Click here to view code.
sequences = c("ea","ia","oa","ua")
fpca_type = "form"

for (sequence in sequences){
  plot_PC1_f1 = PlotPCs(1,1,sequence,fpca_type)
  plot_PC1_f2 = PlotPCs(1,2,sequence,fpca_type)
  plot_PC2_f1 = PlotPCs(2,1,sequence,fpca_type)
  plot_PC2_f2 = PlotPCs(2,2,sequence,fpca_type)
  plot_PC3_f1 = PlotPCs(3,1,sequence,fpca_type)
  plot_PC3_f2 = PlotPCs(3,2,sequence,fpca_type)
  
  big_plot_title = sprintf("fPC Effects on F1 & F2 for /%s/ ",sequence)
  PC_plot_big = grid.arrange(plot_PC1_f1,plot_PC2_f1,plot_PC3_f1,
                             plot_PC1_f2,plot_PC2_f2,plot_PC3_f2,
                             ncol=3,top = textGrob(big_plot_title))
  ggsave(here("Figures", "Plots", "fPCA", paste0("hd_forms_", sequence, ".png")),
         PC_plot_big,scale=1,width=3600,height=2700,units="px")
  
}

Click here to view code.
# Clear variables for tidiness
rm(plot_PC1_f1,plot_PC2_f1,plot_PC3_f1,
   plot_PC1_f2,plot_PC2_f2,plot_PC3_f2,
   big_plot_title,PC_plot_big)

For each sequence and formant, more than 90% of variance observed was explained by at least three fPCs. As a result, three fPCs have been selected for F1 and F2.

For F1 and F2, fPC1 explains the height and general shape of the mean curve. For F1, fPC2 appears to explain the position of the peak. A high score corresponds to a peak later in the sequence and a low score corresponds to a peak earlier in the sequence. For /oa , the inverse is true: a high score corresponds to a peak earlier in the sequence and a low score corresponds to a peak later in the sequence.

F2, fPC2 seems to captures how extreme the difference is between the onset and offset of the sequence. Finally, fPC3 for both F1 and F2 concerns the transition part of the sequence, in particular whether this has more of a concave or convex shape. For F1, a high fPC3 score reflects a more convex shape, with a central peak, while a low fPC3 score reflects a subtle concave dip in the middle of the sequence. For F2, high fPC3 scores correspond to a subtle concave dip in the middle of the sequence, while low scores correspond to a subtle peak. The inverse is the case for /ea/, where low fPC3 scores correspond to a subtle concave dip and high scores correspond to a subtle peak.

  1. Create fPCA plots for pitch and intensity
Click here to view code.
sequences = c("ea","ia","oa","ua")
fpca_type = "pitch"

for (sequence in sequences){
  plot_PC1_pit = PlotPCs(1,1,sequence,fpca_type)
  plot_PC1_int = PlotPCs(1,2,sequence,fpca_type)
  plot_PC2_pit = PlotPCs(2,1,sequence,fpca_type)
  plot_PC2_int = PlotPCs(2,2,sequence,fpca_type)
  plot_PC3_pit = PlotPCs(3,1,sequence,fpca_type)
  plot_PC3_int = PlotPCs(3,2,sequence,fpca_type)
  
  big_plot_title = sprintf("fPC Effects on pitch and intensity for /%s/",sequence)
  PC_plot_big = grid.arrange(plot_PC1_pit,plot_PC2_pit,plot_PC3_pit,
                             plot_PC1_int,plot_PC2_int,plot_PC3_int,
                             ncol=3,top = textGrob(big_plot_title))
 ggsave(here( "Figures", "Plots", "fPCA", paste0("hd_pit-int_", sequence, ".png")),
       PC_plot_big, scale=1, width=3600, height=2700, units="px")
}

Click here to view code.
## Clear variables for tidiness
rm(plot_PC1_pit,plot_PC2_pit,plot_PC3_pit,
   plot_PC1_int,plot_PC2_int,plot_PC3_int,
   big_plot_title,PC_plot_big)

For pitch and intensity at least 90% of the cumulative variance is explained by two fPCs.
However, to align with the number of fPCs selected for F1 and F2, and to ensure the threshold is exceeded in every instance, three fPCs were also chosen for pitch and intensity.

FPC1 captures overall differences absolute in pitch and intensity. For pitch, fPC2 captures the direction of the trajectory. High scores indicate a falling trajectory, while low scores correspond to a rising trajectory. For intensity, fPC2 captures the shape of the trajectory. A high fPC2 score reflects a steep drop, whereas a low fPC1 score indicates a relatively stable intensity across the sequence. For pitch, fPC3 captures the extent to which the central part of the curve is convex or concave, with a high score corresponding to a convex curve, and a low score corresponding to a concave curve. For intensity, fPC3 captures the extent to which there is a pronounced peak. A high fPC3 score indicates a more pronounced peak, while a low score reflects a gradual drop.

6.2 Individual fPC plots for Appendix A

This is a slightly adapted version of the function which includes the sequence name in the title of the plots

Click here to view code.
## MAIN FUNCTION: Generate a plot given a PC and formant (as integer ID)
PlotPCs_caption = function(PC,fpca_type,sequence,fpca_name,flip_symbols=0){
  
  ## Create a working dataset
  working_fpca = get(paste(fpca_name,"_fpca_",sequence,sep=""))[[fpca_type]]
    
  ## get variables from FPCA output
  mean_curve = working_fpca$mu
  PC_curve = working_fpca$phi[,PC]
  PC_mod = PC_curve * sd(working_fpca$xiEst[,PC])
  cum_var = working_fpca$cumFVE
  
  if (fpca_name == "form"){
    time_start = 1
    time_end = 9
  } else {
    time_start = 2
    time_end = 8
  }
  
  ## send to "MorePoints" function, get finer detail curves
  mean_curve = MorePoints(mean_curve,time_start,time_end)
  PC_curve = MorePoints(PC_curve,time_start,time_end)
  PC_mod = MorePoints(PC_mod,time_start,time_end)
  
  FPCA_extract = data.frame(mean_curve,PC_curve,PC_mod)
  
  # get values for plot title and generate titles
  plot_cum_var = cum_var[PC]*100
  plot_PC_var = UnTotal(cum_var,PC)*100
  
  if (fpca_name == "form"){
    if (fpca_type == 1){
      plot_effect = "F1"
    } else {
      plot_effect = "F2"
    }
  } else {
    if (fpca_type == 1){
      plot_effect = "pitch"
    } else {
      plot_effect = "intensity"
    }
  }
  
  plot_title = sprintf("Effect of fPC%s on %s for /%s/ \n(Var: %.1f%% VarTotal: %.1f%%)",PC,plot_effect, sequence, plot_PC_var,plot_cum_var)
  
  if (fpca_name == "form"){
    # if formant, check which formant and adjust limits accordingly
    if (fpca_type == 1){
      y_min = -1.5
      y_max = 3.5 
    } else {
      y_min = -2.5
      y_max = 2.5
    }
      
  } else {
    # alternatively, if pitch/intensity...
    if (fpca_type == 1){
      y_min = -50
      y_max = 50
    } else {
      y_min = -12
      y_max = 7
    }
  }
  
  ## change y label to intensity if intensity is being examined
  if (fpca_name == "pitch" & fpca_type == 2){
    ylabel = "Normalised Intensity"
  } else {
    ylabel = "Normalised Frequency"
  }
  
  
  ## If "flip_symbols" parameter argument isn't false, flip plus and minus symbols
  if (flip_symbols == 0){
    add_symbol = "+"
    sub_symbol = "-"
  } else {
    add_symbol = "-"
    sub_symbol = "+"
  }
  
  PC_plot = ggplot(FPCA_extract, aes(x = seq(time_start,time_end,by=0.5))) +
    
    # plot curves
    geom_smooth(aes(y=mean_curve),se=FALSE,color="black") +
    geom_point(aes(y=mean_curve + PC_mod),
               shape=add_symbol,size=5) +
    geom_point(aes(y=mean_curve - PC_mod),
               shape=sub_symbol,size=5) +
    
    # format plot
    labs(x="Timepoint",y=ylabel,
         title=plot_title) +
    scale_x_continuous(breaks=seq(time_start,time_end,by=1)) + 
    theme_bw() + ylim(y_min,y_max) +
    theme(panel.grid = element_blank(),
          plot.title = element_text(hjust=0.5,size=12))
  
  return(PC_plot)
}

## SUPPORT FUNCTION: Given a specific curve, predict a finer-detail curve 

MorePoints = function(curve,time_start,time_end){
  times=time_start:time_end
  temp_smooth = loess(curve~times)
  temp_smoother = predict(temp_smooth,seq(time_start,time_end,by=0.5))
  return(temp_smoother)
}

## SUPPORT FUNCTION: Return non-cumulative variance contribution
# ('fdapace.FPCA()' objects contain cumulative variances, not individual PC variance)

UnTotal = function(vec,index){
  if (index == 1){
    return(vec[index])
  } else {
    new_vec = vec[index] - vec[index - 1]
    return(new_vec)
  }
}

6.2.1 Intensity fPC2 (Manuscript Figure A1)

Click here to view code.
arrange_ia_pc2.int = PlotPCs_caption(2,2,"ia","pitch")
arrange_ea_pc2.int = PlotPCs_caption(2,2,"ea","pitch")
arrange_oa_pc2.int = PlotPCs_caption(2,2,"oa","pitch")
arrange_ua_pc2.int = PlotPCs_caption(2,2,"ua","pitch")


IntPC2All <- grid.arrange(arrange_ia_pc2.int,arrange_ea_pc2.int, arrange_oa_pc2.int, arrange_ua_pc2.int,
             ncol=4)

Click here to view code.
 ggsave(here( "Figures", "Plots", "fPCA", "IntfPC2All.png") ,IntPC2All, scale=.80,   width=5000,height=1300,units="px")

6.2.2 F1 fPC1 (Manuscript Figure A2)

Click here to view code.
arrange_ia_pc1.f1 = PlotPCs_caption(1,1,"ia","form")
arrange_ea_pc1.f1 = PlotPCs_caption(1,1,"ea","form")
arrange_oa_pc1.f1 = PlotPCs_caption(1,1,"oa","form")
arrange_ua_pc1.f1 = PlotPCs_caption(1,1,"ua","form")




F1PC1All <- grid.arrange(arrange_ia_pc1.f1,arrange_ea_pc1.f1, arrange_oa_pc1.f1, arrange_ua_pc1.f1,
             ncol=4)

Click here to view code.
 ggsave(here( "Figures", "Plots", "fPCA", "F1fPC1All.png") ,F1PC1All, scale=.80,   width=5000,height=1300,units="px")

6.2.3 F2 fPC1+ fPC3 /ia/ (Manuscript Figure A3)

Click here to view code.
arrange_ia_pc1.f2 = PlotPCs_caption(1,2,"ia","form")
arrange_ia_pc3.f2 = PlotPCs_caption(3,2,"ia","form")


F2ia <- grid.arrange(arrange_ia_pc1.f2, arrange_ia_pc3.f2, ncol=2)

Click here to view code.
ggsave(here( "Figures", "Plots", "fPCA", "F2ia.png") ,F2ia, scale=.80,   width=2500,height=1300,units="px")

7 Duration filtering (Manuscript §3.3.3)

Duration filtering occurs at this stage as we only include duration data for sequences which have been through the other filtering processes, and this affects the centering.

  1. Read in fPCA data if need be
Click here to view code.
fpcadata = read.csv(here("Data", "fpca_merged.csv"))

duration_data = read.csv(here("Data", "opening_seqs_selected_data.csv")) %>% 
  unique()
  1. Filter seqs for inclusion in fPCA
Click here to view code.
fpcadata_ids <- fpcadata %>% 
  select(sequence, MatchId) %>% 
  unique()


duration_data <- left_join(fpcadata_ids, duration_data) %>% 
  unique()
  1. Some data prep
Click here to view code.
duration_data <- duration_data %>% 
  mutate(Speaker = as.factor(Speaker)) %>% 
   mutate(sequence = as.factor(sequence))
  1. Add duration to data frame, convert to ms
Click here to view code.
duration_data$duration = duration_data$Target.vowelCluster.end - duration_data$Target.vowelCluster.start

duration_data <- duration_data %>% 
 drop_na(duration) %>% 
  mutate(duration_ms = duration * 1000)  
  1. Filter out sequences with duration > 500 ms
Click here to view code.
duration_data  <-  duration_data %>%
 filter(duration_ms < 500) 

duration_data <- duration_data %>% 
mutate(s_duration = scale(duration, center=TRUE, scale=TRUE))

duration_data = duration_data %>% ungroup()
duration_data$s_duration = as.numeric(duration_data$s_duration)
duration = unique(duration_data %>% select(MatchId, s_duration))

Note that this threshold was decided on based on manually checking the data. We found that for tokens 500ms +, the proportion of forced alignment errors was 15% or greater. However, we did not manually check the entire data set which contains more than 10,000 tokens. As a result, we do not know exactly how many forced alignment errors remain.

We are now ready to conduct the uPCA!

8 uPCA (Manuscript §4.1)

  1. Prepare data. Combine duration data with fPCA data, and filter out any NA values for duration.
Click here to view code.
uPCA_data = left_join(fpcadata, duration, by="MatchId") %>% 
 filter(! is.na(s_duration))  
  1. Rename columns so that they appear more neatly in the index loadings
Click here to view code.
uPCA_data <- uPCA_data %>% 
  rename(`Duration: z-scored` = s_duration,
         `F1: fPC1` = f1_pc1,
         `F1: fPC2` = f1_pc2,
         `F1: fPC3` = f1_pc3,
         `F2: fPC1` = f2_pc1,
         `F2: fPC2` = f2_pc2,
         `F2: fPC3` = f2_pc3,
         `Pitch: fPC1` = pitch_pc1,
         `Pitch: fPC2` = pitch_pc2,
         `Pitch: fPC3` = pitch_pc3,
         `Intensity: fPC1` = intensity_pc1,
         `Intensity: fPC2` = intensity_pc2,
         `Intensity: fPC3` = intensity_pc3,
  )
  1. Create seperate data frames, one for each sequence
Click here to view code.
ea_data = uPCA_data %>% filter(sequence =="ea") 
oa_data = uPCA_data %>% filter(sequence =="oa") 
ia_data = uPCA_data %>% filter(sequence =="ia") 
ua_data = uPCA_data %>% filter(sequence =="ua") 
  1. Run uPCA for each sequence
Click here to view code.
set.seed(1)

oa_test <- pca_test(
  oa_data %>% select(-sequence, -MatchId), 
  n = 500,
  variance_confint = 0.95,
  loadings_confint = 0.9
)

ia_test <- pca_test(
  ia_data %>% select(-sequence, -MatchId), 
  n = 500,
  variance_confint = 0.95,
  loadings_confint = 0.9
)

ua_test <- pca_test(
  ua_data %>% select(-sequence, -MatchId), 
  n = 500,
  variance_confint = 0.95,
  loadings_confint = 0.9
)

ea_test <- pca_test(
  ea_data %>% select(-sequence, -MatchId), 
  n = 500,
  variance_confint = 0.95,
  loadings_confint = 0.9
)
  1. Plot variance explained for each sequence

/ea/

Click here to view code.
plot_variance_explained(ea_test)

/ia/

Click here to view code.
plot_variance_explained(ia_test)

/oa/

Click here to view code.
plot_variance_explained(oa_test)

/ua/

Click here to view code.
plot_variance_explained(ua_test)

8.1 Exploring which uPCs to interpret

We plot the index loadings for uPC1-4 for each sequence. The summary is: uPC1 identifies the main variation in our data, no other uPCs have multiple variables sitting above the null distribution, or if they do it is fPC1 for intensity or pitch, which capture overall height differences.

8.1.1 Index loadings for /ea/, uPC1-4

Click here to view code.
eapc1_loadings_plot_uf <- plot_loadings(ea_test, pc_no=1, filter_boots = FALSE) + geom_text(label="ea",aes(2,.9), size = 10, colour="black") 

eapc1_loadings_plot_uf 

Click here to view code.
eapc2_loadings_plot_uf <- plot_loadings(ea_test, pc_no=2, filter_boots = FALSE) + geom_text(label="ea",aes(2,.7), size = 10, colour="black") + theme(legend.position = "none")
eapc2_loadings_plot_uf

Click here to view code.
eapc3_loadings_plot_uf <- plot_loadings(ea_test, pc_no=3, filter_boots = FALSE) + geom_text(label="ea",aes(2,.9), size = 10, colour="black") 
eapc3_loadings_plot_uf 

Click here to view code.
eapc4_loadings_plot_uf <- plot_loadings(ea_test, pc_no=4, filter_boots = TRUE) + geom_text(label="ea",aes(2,.9), size = 10, colour="black") 
eapc4_loadings_plot_uf

8.1.2 Index loadings for /ia/, uPC1-4

Click here to view code.
iapc1_loadings_plot_uf <- plot_loadings(ia_test, pc_no=1, filter_boots = FALSE) + geom_text (label="ia",aes(2,.9), size = 10, colour="black") 

iapc1_loadings_plot_uf 

Click here to view code.
iapc2_loadings_plot_uf <- plot_loadings(ia_test, pc_no=2, filter_boots = FALSE) + geom_text(label="ia",aes(2,.75), size = 10, colour="black")  
iapc2_loadings_plot_uf

Click here to view code.
iapc3_loadings_plot_uf <- plot_loadings(ia_test, pc_no=3, filter_boots = FALSE) + geom_text(label="ia",aes(2,.75), size = 10, colour="black")  
iapc3_loadings_plot_uf

Click here to view code.
iapc4_loadings_plot_uf <- plot_loadings(ia_test, pc_no=4, filter_boots = FALSE) + geom_text(label="ia",aes(2,.75), size = 10, colour="black")  
iapc4_loadings_plot_uf

8.1.3 Index loadings for /oa/, uPC1-4

Click here to view code.
oapc1_loadings_plot_uf <- plot_loadings(oa_test, pc_no=1, filter_boots = FALSE) + geom_text(label="oa",aes(2,.8), size = 10, colour = "black") 

oapc1_loadings_plot_uf 

Click here to view code.
oapc2_loadings_plot_uf <- plot_loadings(oa_test, pc_no=2, filter_boots = TRUE) + geom_text(label="oa",aes(2,.7), size = 10, colour="black") 
oapc2_loadings_plot_uf 

Click here to view code.
oapc3_loadings_plot_uf <- plot_loadings(oa_test, pc_no=3, filter_boots = TRUE) + geom_text(label="oa",aes(2,.8), size = 10, colour = "black") 
oapc3_loadings_plot_uf

Click here to view code.
oapc4_loadings_plot_uf <- plot_loadings(oa_test, pc_no=4, filter_boots = TRUE)+ geom_text(label="oa",aes(2,.8), size = 10, colour = "black") 
oapc4_loadings_plot_uf

8.1.4 Index loadings for /ua/, uPC1-4

  1. Flip the loadings to match the others.
Click here to view code.
ua_test$loadings <- ua_test$loadings %>%
   mutate(
        loading = if_else(PC == "PC1", loading * -1, loading)
    ) 
Click here to view code.
uapc1_loadings_plot_uf <- plot_loadings(ua_test, pc_no=1, filter_boots = FALSE)+ geom_text(label="ua",aes(2,.8), size = 10, colour="black")
uapc1_loadings_plot_uf

Click here to view code.
uapc2_loadings_plot_uf <- plot_loadings(ua_test, pc_no=2, filter_boots = TRUE) + geom_text(label="ua",aes(2,.75), size = 10, colour="black")  
uapc2_loadings_plot_uf

Click here to view code.
uapc3_loadings_plot_uf <- plot_loadings(ua_test, pc_no=3, filter_boots = TRUE) + geom_text(label="ua",aes(2,.75), size = 10, colour="black")  
uapc3_loadings_plot_uf

Click here to view code.
uapc4_loadings_plot_uf <- plot_loadings(ua_test, pc_no=4, filter_boots = TRUE) + geom_text(label="ua",aes(2,.75), size = 10, colour="black")  
uapc4_loadings_plot_uf

8.2 Create horizontal index loading plot for uPC1 (Manuscript Figure 2)

  1. Define custom function for creating horizontal index loading plots. This code is adapted from the plot_loadings() function (used above) in the nzilbb.vowels() package (Wilson Black and Brand 2022)
Click here to view code.
plot_loadings_horizontal <- function(
    pca_test, pc_no = 1, violin=FALSE, filter_boots = FALSE,
    quantile_threshold = 0.25
) {

  stopifnot(
    "Data must come from an object of class pca_test_results" =
      class(pca_test) == "pca_test_results",
    "pc_no must be a number." =
      is.numeric(pc_no),
    "violin must be either TRUE or FALSE." =
      is.logical(violin),
    "filter_boots must be either TRUE or FALSE." =
      is.logical(filter_boots)
  )

  if (filter_boots) {

    plot_data <- pca_test$raw_data |>
      filter(
        as.numeric(str_sub(.data$PC, start = 3L)) == pc_no,
        source != "original"
      ) |>
      group_by(.data$source, .data$variable) |>
      mutate(
        median_index = stats::median(.data$index_loading),
        quant_threshold = stats::quantile(
          .data$index_loading,
          quantile_threshold
        )
      ) |>
      ungroup() |>
      mutate(
        largest_loading = .data$median_index == base::max(.data$median_index),
      ) |>
      group_by(.data$source, .data$iteration) |>
      filter(
        source != "bootstrapped" |
        any(
          .data$largest_loading & .data$index_loading >= .data$quant_threshold
        )
      ) |>
      group_by(.data$source, .data$variable) |>
      mutate(
        low_limit = stats::quantile(
          .data$index_loading,
          (1 - pca_test$loadings_confint)/2
        ),
        high_limit = stats::quantile(
          .data$index_loading,
          1 - (1 - pca_test$loadings_confint)/2
        )
      ) |>
      ungroup() |>
      mutate(
        distribution = if_else(
          .data$source == "bootstrapped",
          "Sampling",
          "Null"
        )
      ) |>
      select(-.data$index_loading, -.data$loading) |>
      left_join(
        pca_test$loadings |> select(
          .data$PC,
          .data$variable,
          .data$index_loading,
          .data$loading
        ),
        by = c("PC", "variable")
      )

    # Calculate count of kept iterations for subtitle
    kept_iterations <- plot_data |>
      filter(
        .data$distribution == "Sampling"
      ) |>
      pull(.data$iteration) |>
      base::unique() |>
      base::length()

    subtitle = glue(
      "Filtered Bootstrap Sampling ({kept_iterations} Iterations) ",
      "and Permutation-Based Null Distributions"
    )

  } else {

    plot_data <- pca_test$loadings |>
      # Filter so we only have data from desired PC.
      filter(
        as.numeric(str_sub(.data$PC, start = 3L)) == pc_no
      ) |>
      # Reshape so that both permutation and bootstrapped limits are on same
      # variables.
      pivot_longer(
        cols = contains('low'),
        names_to = "distribution",
        values_to = 'low_limit',
        names_pattern = "_(.*)"
      ) |>
      pivot_longer(
        cols = contains('high'),
        names_to = "distribution_2",
        values_to = 'high_limit',
        names_pattern = "_(.*)"
      ) |>
      filter(
        .data$distribution == .data$distribution_2
      ) |>
      select(-"distribution_2") |>
      mutate(
        distribution = if_else(
          str_detect(.data$distribution, 'null'),
          "Null",
          "Sampling"
        )
      )

    subtitle = glue(
      "Bootstrapped Sampling and Permutation-Based Null Distributions"
    )

  }

  plot_data <- plot_data |>
    mutate(
      # Reorder 'variable'  column so variables plotted in ascending order by
      # loading.
      variable = fct_reorder(.data$variable, .data$index_loading),
      loading_sign = if_else(.data$loading < 0, "-", "+")
    )

  if (violin) {

    violin_data <- pca_test$raw_data |>
      filter(
        source == "bootstrapped",
        as.numeric(str_sub(.data$PC, start = 3L)) == pc_no
      ) |>
      mutate(
        distribution = "Sampling"
      ) |>
      select(
        .data$distribution,
        .data$variable,
        .data$index_loading,
        .data$loading,
        .data$iteration
      ) |>
      # Reorder 'variable'  column so variables plotted in ascending order by
      # median bootstrapped loading.
      group_by(.data$variable) |>
      mutate(
        median_index = stats::median(.data$index_loading)
      ) |>
      ungroup() |>
      mutate(
        variable = fct_reorder(.data$variable, .data$median_index)
      )

    if (filter_boots) {
      violin_data <- violin_data |>
        group_by(.data$variable) |>
        mutate(
          first_quartile = stats::quantile(.data$index_loading, 0.25)
        ) |>
        ungroup() |>
        mutate(
          largest_loading = .data$median_index == max(.data$median_index),
        ) |>
        group_by(.data$iteration) |>
        filter(
          any(.data$largest_loading & .data$index_loading >= .data$first_quartile)
        )

      kept_iterations <- base::length(base::unique(violin_data$iteration))

    }

    violin_element <- geom_violin(
        data = violin_data,
        alpha = 0.5
      )

  } else {

    violin_element <- NULL

  }

  out_plot <- plot_data |>
    ggplot(
      aes(
        x = .data$index_loading,
        y = .data$variable,
        colour = .data$distribution
      )
    ) +
    violin_element +
    geom_errorbar(
      aes(
        xmin = .data$low_limit,
        xmax = .data$high_limit
      )
    ) +
    # geom_point(colour = "red") +
    geom_text(aes(label = .data$loading_sign), size = 8, colour = "black", vjust = 0.4, family = "Consolas" ) +
    scale_colour_manual(
      values = c("Sampling" = "#F8766D", "Null" = "#00BFC4")
    ) +
    labs(
      title = glue("Index Loadings for PC{pc_no}"),
      subtitle = subtitle,
      colour = "Distribution",
      y = "Variable",
      x = "Index Loading"
    )

  out_plot

}
  1. /ia/ uPC1 index loadings
Click here to view code.
iapc1_loadings_plot_horizonal <- plot_loadings_horizontal(ia_test, pc_no=1, filter_boots = FALSE) + 
     theme_minimal() + theme(legend.position = "none", plot.title = element_text(size = 12), text = element_text(size = 8), axis.text = element_text(size = 8))+  labs(title = "ia", subtitle = NULL)
iapc1_loadings_plot_horizonal 

  1. /ea/ uPC1 index loadings
Click here to view code.
eapc1_loadings_plot_horizonal <- plot_loadings_horizontal(ea_test, pc_no=1, filter_boots = FALSE) + 
     theme_minimal() + theme(legend.position = "none", plot.title = element_text(size = 12), axis.title.y = element_blank(), text = element_text(size = 8), axis.text = element_text(size = 8))+  labs(title = "ea", subtitle = NULL)

eapc1_loadings_plot_horizonal  

  1. /oa/ uPC1 index loadings
Click here to view code.
oapc1_loadings_plot_horizonal  <- plot_loadings_horizontal(oa_test, pc_no=1, filter_boots = FALSE) + 
     theme_minimal() + theme(legend.position = "none", plot.title = element_text(size = 12), axis.title.y = element_blank(), text = element_text(size = 8), axis.text = element_text(size = 8))+  labs(title = "oa", subtitle = NULL)

oapc1_loadings_plot_horizonal 

5./ua/ uPC1 index loadings

Click here to view code.
uapc1_loadings_plot_horizonal <- plot_loadings_horizontal(ua_test, pc_no=1, filter_boots = FALSE) + 
     theme_minimal() +  theme(legend.position = "none", plot.title = element_text(size = 12), axis.title.y = element_blank(), text = element_text(size = 8), axis.text = element_text(size = 8))+  labs(title = "ua", subtitle = NULL)


uapc1_loadings_plot_horizonal 

  1. Create combined plot of uPC1 loadings and save
Click here to view code.
  uPC1AllHorizontal <-  grid.arrange(iapc1_loadings_plot_horizonal, eapc1_loadings_plot_horizonal, oapc1_loadings_plot_horizonal, uapc1_loadings_plot_horizonal, nrow = 1)

Click here to view code.
 ggsave(here( "Figures", "Plots", "uPCA", "uPC1AllHorizontal.png"), uPC1AllHorizontal,  width = 25, height =7 , units = "cm", bg = "white")

8.3 Prepare and save uPCA data

  1. Prepare uPCA data
Click here to view code.
ia_pca <- ia_data %>%
  # Remove the speaker column as this is not wanted by PCA.
  select(-sequence, -MatchId) %>%
  # We scale the variables (more on this in a moment)
  prcomp(scale = TRUE)
 
ea_pca <- ea_data %>%
  select(-sequence, -MatchId) %>%
  prcomp(scale = TRUE)

ua_pca <- ua_data %>%
  select(-sequence, -MatchId) %>%
  prcomp(scale = TRUE)

oa_pca <- oa_data %>%
  select(-sequence, -MatchId) %>%
  prcomp(scale = TRUE)
  1. Add sequences details
Click here to view code.
seqs_details <- read.csv(here("Data", "opening_seqs_selected_data.csv")) 
  1. Create data frames
Click here to view code.
eaPCs = as.data.frame(ea_pca$x)
eaPCs2 = eaPCs %>% select(PC1,PC2,PC3, PC4)
iaPCs = as.data.frame(ia_pca$x)
iaPCs2 = iaPCs %>% select(PC1,PC2,PC3, PC4)
oaPCs = as.data.frame(oa_pca$x)
oaPCs2 = oaPCs %>% select(PC1,PC2,PC3, PC4)
uaPCs = as.data.frame(ua_pca$x)
uaPCs2 = uaPCs %>% select(PC1,PC2,PC3, PC4)
earesults = cbind(ea_data, eaPCs2)
iaresults = cbind(ia_data, iaPCs2)
oaresults = cbind(oa_data, oaPCs2)
uaresults = cbind(ua_data, uaPCs2)

earesults2 = left_join(earesults, seqs_details, by = c("MatchId", "sequence"))
iaresults2 = left_join(iaresults, seqs_details,by = c("MatchId", "sequence"))
oaresults2 = left_join(oaresults, seqs_details, by = c("MatchId", "sequence"))
uaresults2 = left_join(uaresults, seqs_details, by = c("MatchId", "sequence"))
  1. Save as .csvs
Click here to view code.
write.csv(earesults2, here("Data", "ea_uPCAresults.csv"))
write.csv(oaresults2, here("Data","oa_uPCAresults.csv"))
write.csv(iaresults2, here("Data", "ia_uPCAresults.csv"))
write.csv(uaresults2, here("Data","ua_uPCAresults.csv"))

8.4 uPCA visualisations

  1. Read in uPCA data if need be
Click here to view code.
earesults = read.csv(here("Data", "ea_uPCAresults.csv"))
oaresults = read.csv(here("Data","oa_uPCAresults.csv"))
iaresults = read.csv(here("Data", "ia_uPCAresults.csv"))
uaresults = read.csv(here("Data","ua_uPCAresults.csv"))
  1. Define some PC categories, We’re calling everything above one ‘hi’, and below negative one ‘low’. Combine these into a single data frame of ‘extreme’ results.
Click here to view code.
earesults$PC1cat = "mid"
earesults[earesults$PC1 > 1,]$PC1cat = "hi"
earesults[earesults$PC1 < -1,]$PC1cat = "low"
earesultsextreme = earesults %>% filter(PC1cat != "mid")

 
oaresults$PC1cat = "mid"
oaresults[oaresults$PC1 > 1,]$PC1cat = "hi"
oaresults[oaresults$PC1 < -1,]$PC1cat = "low"
oaresultsextreme = oaresults %>% filter(PC1cat != "mid")

#flip ua
uaresults$PC1cat = "mid"
uaresults[uaresults$PC1 > 1,]$PC1cat = "low"
uaresults[uaresults$PC1 < -1,]$PC1cat = "hi"
uaresultsextreme = uaresults %>% filter(PC1cat != "mid")

iaresults$PC1cat = "mid"
iaresults[iaresults$PC1 > 1,]$PC1cat = "hi"
iaresults[iaresults$PC1 < -1,]$PC1cat = "low"
iaresultsextreme = iaresults %>% filter(PC1cat != "mid")


uPC1_results_all <- rbind(earesults, oaresults, uaresults, iaresults)
results_extreme_all  <- rbind(earesultsextreme, oaresultsextreme, uaresultsextreme, iaresultsextreme)
  1. Read in acoustic data
Click here to view code.
int <- read.csv(here("Data", "intcentered_per_speaker.csv")) %>% 
select(MatchId, sequence, time, intensity)
 
pitch <- read.csv(here("Data", "pitch_centered_per_speaker_nofilter.csv")) %>% 
select(MatchId, sequence, time, pitch)

pitch_int <- left_join(int, pitch)


pitch_int = pitch_int %>%  group_by(MatchId) %>%
    mutate(c_pitch = scale(pitch, center=TRUE, scale=FALSE),
         c_intensity = scale(intensity, center=TRUE, scale=FALSE)) 

pitch = pitch_int 

 
 formants_filtered <- read_csv(here("Data", "formants_filtered_all.csv")) %>% 
  dplyr::select(Vowel, MatchId, time, Formant, Frequency)
  
 formants <- formants_filtered %>% 
  pivot_wider(
    names_from = Formant,
    values_from = Frequency
  )  
  1. Combine with uPCA results
Click here to view code.
earesultspitch = left_join(earesultsextreme, pitch, by="MatchId")
iaresultspitch = left_join(iaresultsextreme, pitch, by="MatchId")
oaresultspitch = left_join(oaresultsextreme, pitch,  by="MatchId")
uaresultspitch = left_join(uaresultsextreme, pitch,  by="MatchId")

earesultsformants = left_join(earesultsextreme, formants, by="MatchId")
iaresultsformants = left_join(iaresultsextreme, formants, by="MatchId")
oaresultsformants = left_join(oaresultsextreme, formants, by="MatchId")
uaresultsformants = left_join( uaresultsextreme,  formants, by="MatchId")


pc_pitch_results_all <- rbind(earesultspitch,iaresultspitch,oaresultspitch, uaresultspitch)
pc_formants_results_all <- rbind(earesultsformants, iaresultsformants, oaresultsformants, uaresultsformants)

8.4.1 Combined plot by uPC1 category (Manuscript Figure 3)

  1. Plot duration by uPC1 category
Click here to view code.
results_extreme_duration <- results_extreme_all %>% 
  filter(PC1cat != "mid") %>% 
  rename(s_duration = Duration..z.scored)

 
results_extreme_duration$sequence <- factor(results_extreme_duration$sequence, levels = c("ia", "ea", "oa", "ua"))

duration_plot <- ggplot(results_extreme_duration, aes(x =PC1cat,  y = s_duration, fill = PC1cat)) +
  geom_violin() +  # Change to violin plot
  geom_point(stat = "summary", fun = "mean", color = "white", size = 2) +  # Add points for mean
  stat_summary(fun = "median", geom = "point", color = "black", size = 2) +  # Add points for median
  facet_wrap(~ sequence, nrow = 1) +
  theme_minimal() +
  theme(panel.background = element_rect(fill = "white"), legend.position = "none") +
  labs(y = "z-scored duration", x = "")  +
  theme(axis.title.x = element_text(size = 8), axis.title.y = element_text(size = 8))

duration_plot

  1. Plot intensity trajectories by uPC1 category
Click here to view code.
pc_pitch_results_all <-  pc_pitch_results_all %>% 
  select(-sequence.x) %>% 
  rename(sequence = sequence.y)

 pc_pitch_results_all$sequence <- factor(pc_pitch_results_all$sequence, levels = c("ia", "ea", "oa", "ua"))

 uPCInt <- ggplot(pc_pitch_results_all, aes(x = time, y = intensity, colour = PC1cat, label = PC1cat)) +
  geom_textsmooth(method = "loess", span = 0.5, linewidth = 1,  size = 2) +
  facet_wrap(~ sequence, nrow = 1) +
  theme_minimal() +
  labs(color = "uPC1 Category") +
  theme(legend.position = "none",
        axis.title.x = element_text(size = 8),
        axis.title.y = element_text(size = 8))

uPCInt

  1. Plot F1 trajectories by uPC1 category
Click here to view code.
 pc_formants_results_all$sequence <- factor(pc_formants_results_all$sequence, levels = c("ia", "ea", "oa", "ua"))

uPCF1 <- ggplot(pc_formants_results_all, aes(x = time, y = F1_lobanov_2.0, colour = PC1cat, label = PC1cat)) +
  geom_textsmooth(method = "loess", span = 0.5, linewidth = 1, size = 2) +
  facet_wrap(~ sequence, nrow = 1) +
  theme_minimal() +
  labs(color = "uPC1 Category") +
  theme(legend.position = "none",
        axis.title.x = element_text(size = 8),
        axis.title.y = element_text(size = 8))

uPCF1

  1. Create combined plot
Click here to view code.
    plots_combined <- cowplot::plot_grid(duration_plot, uPCInt, uPCF1,
                            labels = c("a", "b", "c"), ncol = 1)
    plots_combined

  1. Save
Click here to view code.
ggsave(here( "Figures", "Plots", "uPCA", "uPC1DurationIntF1.png"), plots_combined,  width = 15, height =15 , units = "cm", bg = "white")

8.5 F2 trajectories: high and low uPC1 tokens /ia/ (Manuscript Figure 4)

This code creates a visualisation of the F2 trajectories of high and low uPC1 tokens of /ia/.

Click here to view code.
 uPCF2ia <- ggplot(iaresultsformants, aes(x = time, y = F2_lobanov_2.0, colour = PC1cat, label = PC1cat)) +
  geom_textsmooth(method = "loess", span = 0.5, linewidth = 1, size = 2) +
  theme_minimal() +
  theme(legend.position = "none",
        axis.title.x = element_text(size = 8),
        axis.title.y = element_text(size = 8))

uPCF2ia

Click here to view code.
ggsave(here( "Figures", "Plots", "uPCA", "uPC1F2ia.png"), uPCF2ia,   width=9, height= 7 ,units="cm")

8.6 Plot of High and low uPC1 formant trajectories with intensity (Manuscript Figure 5)

  1. Some initial data prep
Click here to view code.
sequences  = pc_formants_results_all
 pitch = pc_pitch_results_all


sequences$participant_gender = as.factor(sequences$participant_gender)
sequences$category = as.factor(sequences$category)
 sequences$sequence = as.factor(sequences$sequence)
 

sequences$category_gender = interaction(sequences$participant_gender, sequences$category)

8.6.1 Prepare formant trajectories

  1. View the data
Click here to view code.
vowels <- sequences

 
vowels %>%
  head(10) %>%
  kable() %>%
  kable_styling(font_size = 11) %>%
  scroll_box(width = "100%")
X.3 sequence MatchId F1..fPC1 F1..fPC2 F1..fPC3 F2..fPC1 F2..fPC2 F2..fPC3 Pitch..fPC1 Pitch..fPC2 Pitch..fPC3 Intensity..fPC1 Intensity..fPC2 Intensity..fPC3 Duration..z.scored PC1 PC2 PC3 PC4 X.2 X.1 X Corpus Speaker category participant_gender Before.Match Text After.Match Target.word Target.orthography Target.vowelCluster Target.vowelCluster.start Target.vowelCluster.end joincode word word.alt.format final stress moraPosition complex Language participant_language PC1cat Vowel time F1_lobanov_2.0 F2_lobanov_2.0 category_gender
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 1 0.2697415 0.4512961 M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 2 0.9771713 0.6559407 M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 3 1.4925845 0.6381455 M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 4 1.7654503 0.3334030 M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 5 2.0989529 0.1443292 M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 6 1.9271485 -0.3383652 M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 7 1.8564055 -0.4028727 M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 8 1.5936459 -0.1737597 M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 9 2.0282099 -0.1448426 M.PresentElder
4 ea g_10;em_12_710;n_31357-n_31358;p_28;#=ew_69_149890;prefix=00532-;[0]=ew_0_6365 -0.2938114 -0.0357030 -0.3236411 0.0990935 -0.0026037 0.3933920 9.087662 -7.878749 -1.953018 -5.2253531 -3.810278 2.256708 -0.3274888 1.104122 0.2901737 0.623884 0.0639671 70 112 114 MAONZE K001M PresentElder M ngaa mea katoa mea mea ea 111.275 111.405 mea ea mea mea TRUE yes 1 no M M hi ea 1 0.5426073 0.4090325 M.PresentElder
  1. Pivot the data
Click here to view code.
vowels <- vowels %>%
  pivot_longer(
    cols = F1_lobanov_2.0:F2_lobanov_2.0, # Select the columns to turn into rows.
    names_to = "Formant", # Name the column to indicate if data is F1 or F2,
    values_to = "Frequency"
  )

vowels %>%
  head(10) %>%
  kable() %>%
  kable_styling(font_size = 11) %>%
  scroll_box(width = "100%")
X.3 sequence MatchId F1..fPC1 F1..fPC2 F1..fPC3 F2..fPC1 F2..fPC2 F2..fPC3 Pitch..fPC1 Pitch..fPC2 Pitch..fPC3 Intensity..fPC1 Intensity..fPC2 Intensity..fPC3 Duration..z.scored PC1 PC2 PC3 PC4 X.2 X.1 X Corpus Speaker category participant_gender Before.Match Text After.Match Target.word Target.orthography Target.vowelCluster Target.vowelCluster.start Target.vowelCluster.end joincode word word.alt.format final stress moraPosition complex Language participant_language PC1cat Vowel time category_gender Formant Frequency
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.436463 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.60023 6.860915 -4.461722 -0.8902482 10.48121 4.386573 0.337341 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 1 M.PresentElder F1_lobanov_2.0 0.2697415
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.436463 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.60023 6.860915 -4.461722 -0.8902482 10.48121 4.386573 0.337341 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 1 M.PresentElder F2_lobanov_2.0 0.4512961
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.436463 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.60023 6.860915 -4.461722 -0.8902482 10.48121 4.386573 0.337341 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 2 M.PresentElder F1_lobanov_2.0 0.9771713
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.436463 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.60023 6.860915 -4.461722 -0.8902482 10.48121 4.386573 0.337341 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 2 M.PresentElder F2_lobanov_2.0 0.6559407
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.436463 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.60023 6.860915 -4.461722 -0.8902482 10.48121 4.386573 0.337341 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 3 M.PresentElder F1_lobanov_2.0 1.4925845
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.436463 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.60023 6.860915 -4.461722 -0.8902482 10.48121 4.386573 0.337341 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 3 M.PresentElder F2_lobanov_2.0 0.6381455
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.436463 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.60023 6.860915 -4.461722 -0.8902482 10.48121 4.386573 0.337341 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 4 M.PresentElder F1_lobanov_2.0 1.7654503
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.436463 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.60023 6.860915 -4.461722 -0.8902482 10.48121 4.386573 0.337341 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 4 M.PresentElder F2_lobanov_2.0 0.3334030
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.436463 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.60023 6.860915 -4.461722 -0.8902482 10.48121 4.386573 0.337341 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 5 M.PresentElder F1_lobanov_2.0 2.0989529
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.436463 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.60023 6.860915 -4.461722 -0.8902482 10.48121 4.386573 0.337341 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 5 M.PresentElder F2_lobanov_2.0 0.1443292
  1. Nest the data
Click here to view code.
vowels$Vowel = vowels$sequence


vowels <- vowels %>%
  group_by(Vowel, Formant, PC1cat) %>%
  nest()
  1. Fit GAMs to the data
Click here to view code.
vowels <- vowels %>%
  mutate(
    model = map(
      data, # We are applying a function to the entries of the `data` column.
      # This is the function we are applying (introduced with a ~)
      ~ bam( 
        # Here's our formula.
        Frequency ~ participant_gender +
          s(time, by=participant_gender, k=5),
        data = .x, # Here's our pronoun.
        # Then some arguments to speed up the model fit.
        method = 'fREML',
        discrete = TRUE,
        nthreads = 2
      )
    )
  )
  1. Get predictions
Click here to view code.
to_predict <- list(
  "time" = seq(from=1, to=9, by=1), # All years
  "participant_gender" = c("M", "F")
) 

vowels <- vowels %>%
  mutate(
    prediction = map(
      model, # This time we're applying the function to all the models.
      # We again introduce the function with '~', and indicate where the model 
      # goes with '.x'.
      ~ get_predictions(model = .x, cond = to_predict, print.summary = FALSE)
    )
  )
  1. View predictions
Click here to view code.
vowels$prediction[[1]] %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
participant_gender time fit CI
M 1 0.7404713 0.1037006
F 1 0.7295707 0.0940714
M 2 1.2598329 0.0689358
F 2 1.2265593 0.0627091
M 3 1.7033801 0.0748911
F 3 1.6807448 0.0681337
  1. Format predictions
Click here to view code.
predictions <- vowels %>%
  select(
    Vowel, Formant, PC1cat, prediction
  ) %>%
  unnest(prediction)

predictions %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
Vowel Formant PC1cat participant_gender time fit CI
ea F1_lobanov_2.0 low M 1 0.7404713 0.1037006
ea F1_lobanov_2.0 low F 1 0.7295707 0.0940714
ea F1_lobanov_2.0 low M 2 1.2598329 0.0689358
ea F1_lobanov_2.0 low F 2 1.2265593 0.0627091
ea F1_lobanov_2.0 low M 3 1.7033801 0.0748911
ea F1_lobanov_2.0 low F 3 1.6807448 0.0681337
Click here to view code.
predictions <- predictions %>%
  select( # Remove unneeded variables
    -CI
  ) %>%
  pivot_wider( # Pivot
    names_from = Formant,
    values_from = fit
  )

predictions %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
Vowel PC1cat participant_gender time F1_lobanov_2.0 F2_lobanov_2.0
ea low M 1 0.7404713 0.6698052
ea low F 1 0.7295707 0.9172131
ea low M 2 1.2598329 0.5245497
ea low F 2 1.2265593 0.7956188
ea low M 3 1.7033801 0.3382139
ea low F 3 1.6807448 0.5886874
  1. Get first observations which we will use in the plot
Click here to view code.
predictions$Vowelcat = paste(predictions$Vowel,predictions$PC1cat)


first_obs <- predictions %>%
  group_by(Vowelcat, participant_gender) %>%
  slice(which.min(time))

ffirst_obs <- predictions %>% filter(participant_gender == "F") %>%
  group_by(Vowelcat) %>%
  slice(which.min(time))

8.6.2 Prepare intensity trajectories

  1. Some data prep
Click here to view code.
pitch$MatchTime = paste(pitch$MatchId, pitch$time)
sequences$MatchTime = paste(sequences$MatchId, sequences$time)

sequenceswithpitch = left_join(sequences, pitch)
 
sequenceswithpitch$participant_gender = as.factor(sequenceswithpitch$participant_gender)
sequenceswithpitch$category = as.factor(sequenceswithpitch$category)
sequenceswithpitch$sequence = as.factor(sequenceswithpitch$sequence)


sequenceswithpitch$category_gender = interaction(sequenceswithpitch$participant_gender, sequenceswithpitch$category)

vowels <- sequenceswithpitch

vowels %>%
  head(10) %>%
  kable() %>%
  kable_styling(font_size = 11) %>%
  scroll_box(width = "100%")
X.3 sequence MatchId F1..fPC1 F1..fPC2 F1..fPC3 F2..fPC1 F2..fPC2 F2..fPC3 Pitch..fPC1 Pitch..fPC2 Pitch..fPC3 Intensity..fPC1 Intensity..fPC2 Intensity..fPC3 Duration..z.scored PC1 PC2 PC3 PC4 X.2 X.1 X Corpus Speaker category participant_gender Before.Match Text After.Match Target.word Target.orthography Target.vowelCluster Target.vowelCluster.start Target.vowelCluster.end joincode word word.alt.format final stress moraPosition complex Language participant_language PC1cat Vowel time F1_lobanov_2.0 F2_lobanov_2.0 category_gender MatchTime intensity pitch c_pitch c_intensity
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 1 0.2697415 0.4512961 M.PresentElder g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1 NA NA NA NA
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 2 0.9771713 0.6559407 M.PresentElder g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 2 74 152 5.571429 4.285714
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 3 1.4925845 0.6381455 M.PresentElder g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 3 75 152 5.571429 5.285714
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 4 1.7654503 0.3334030 M.PresentElder g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 4 74 152 5.571429 4.285714
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 5 2.0989529 0.1443292 M.PresentElder g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 5 73 149 2.571429 3.285714
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 6 1.9271485 -0.3383652 M.PresentElder g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 6 72 145 -1.428571 2.285714
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 7 1.8564055 -0.4028727 M.PresentElder g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 7 67 139 -7.428571 -2.714286
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 8 1.5936459 -0.1737597 M.PresentElder g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 8 53 136 -10.428571 -16.714286
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 9 2.0282099 -0.1448426 M.PresentElder g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 9 NA NA NA NA
4 ea g_10;em_12_710;n_31357-n_31358;p_28;#=ew_69_149890;prefix=00532-;[0]=ew_0_6365 -0.2938114 -0.0357030 -0.3236411 0.0990935 -0.0026037 0.3933920 9.087662 -7.878749 -1.953018 -5.2253531 -3.810278 2.256708 -0.3274888 1.104122 0.2901737 0.623884 0.0639671 70 112 114 MAONZE K001M PresentElder M ngaa mea katoa mea mea ea 111.275 111.405 mea ea mea mea TRUE yes 1 no M M hi ea 1 0.5426073 0.4090325 M.PresentElder g_10;em_12_710;n_31357-n_31358;p_28;#=ew_69_149890;prefix=00532-;[0]=ew_0_6365 1 NA NA NA NA
  1. Nest data
Click here to view code.
vowels$Vowel = vowels$sequence


vowels <- vowels %>%
  group_by(Vowel, PC1cat) %>%
  nest()
  1. Fit GAMs to the data
Click here to view code.
vowels <- vowels %>%
  mutate(
    model = map(
      data, # We are applying a function to the entries of the `data` column.
      # This is the function we are applying (introduced with a ~)
      ~ bam( 
        # Here's our formula.
        c_intensity ~ participant_gender +
          s(time, by=participant_gender, k=5),
        data = .x, # Here's our pronoun.
        # Then some arguments to speed up the model fit.
        method = 'fREML',
        discrete = TRUE,
        nthreads = 2
      )
    )
  )
  1. Get predictions
Click here to view code.
to_predict <- list(
  "time" = seq(from=1, to=9, by=1), # All years
  "participant_gender" = c("M", "F")
) 
# BTW: Get prediction will just assume the average value for any predictors not
# mentioned (in this case, Speech_rate).

vowels <- vowels %>%
  mutate(
    prediction = map(
      model, # This time we're applying the function to all the models.
      # We again introduce the function with '~', and indicate where the model 
      # goes with '.x'.
      ~ get_predictions(model = .x, cond = to_predict, print.summary = FALSE)
    )
  )
  1. View predictions
Click here to view code.
vowels$prediction[[1]] %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
participant_gender time fit CI
M 1 4.511616 0.7639374
F 1 3.410783 0.6966628
M 2 4.124922 0.3373198
F 2 3.234433 0.3050947
M 3 3.652382 0.2749016
F 3 2.996439 0.2501579
  1. Format predictions
Click here to view code.
apredictions <- vowels %>%
  select(
    Vowel, prediction
  ) %>%
  unnest(prediction)

apredictions %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
PC1cat Vowel participant_gender time fit CI
low ea M 1 4.511616 0.7639374
low ea F 1 3.410783 0.6966628
low ea M 2 4.124922 0.3373198
low ea F 2 3.234433 0.3050947
low ea M 3 3.652382 0.2749016
low ea F 3 2.996439 0.2501579
Click here to view code.
apredictions <- apredictions %>%
  select( # Remove unneeded variables
    -CI
  ) 

apredictions %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
PC1cat Vowel participant_gender time fit
low ea M 1 4.511616
low ea F 1 3.410783
low ea M 2 4.124922
low ea F 2 3.234433
low ea M 3 3.652382
low ea F 3 2.996439
  1. Get first predictions for plot
Click here to view code.
apredictions$Vowelcat = paste(apredictions$Vowel,apredictions$PC1cat)

predictions$Vowelcat = paste(predictions$Vowel,predictions$PC1cat)

predictions$Intensity = apredictions$fit
  

ffirst_obs_amp <- apredictions %>% filter(participant_gender == "F") %>%
  group_by(Vowelcat) %>%
  slice(which.min(time))

8.6.3 Generate monophthong elipses labels + create final plot

  1. Read in monophthongs data
Click here to view code.
monophthongs = read.csv(here("Data", "monophthongsfinal.csv"))
  1. Calculate mean for each monophthong
Click here to view code.
i_means <- monophthongs %>% 
  filter(Target.teAkaSegment == "i") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
e_means <- monophthongs %>% 
  filter(Target.teAkaSegment == "e") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
a_means <- monophthongs %>% 
  filter(Target.teAkaSegment == "a") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
o_means <- monophthongs %>% 
  filter(Target.teAkaSegment == "o") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  

u_means <- monophthongs %>% 
  filter(Target.teAkaSegment == "u") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  1. Combine into a data frame
Click here to view code.
monophthong_means <- rbind(i_means, e_means, a_means, o_means, u_means) %>% 
  rename(F1_lobanov_2.0 = meanF1) %>% 
  rename(F2_lobanov_2.0 = meanF2)
  1. Make combined plot
Click here to view code.
femalemono = monophthongs %>% filter(participant_gender == "F")
femaleseq = predictions %>% filter(participant_gender == "F")
fplot <- femalemono %>%
  ggplot(aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, colour = Target.teAkaSegment)) +
   stat_ellipse(level = 0.67, geom = "polygon", alpha = 0.1, aes(fill = Target.teAkaSegment), show.legend = FALSE) +
  scale_x_reverse() + scale_y_reverse() +
   scale_fill_grey(start = 0.1, end = 0.9) +
    geom_text(data= monophthong_means,
            aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, label = Target.teAkaSegment),  show.legend = FALSE, size = 2)  +
 geom_path(data = femaleseq, aes(
    x = F2_lobanov_2.0,
    y = F1_lobanov_2.0,
    colour = PC1cat, linewidth = Intensity),  
    size = 1, show.legend = TRUE,
    arrow = arrow(length = unit(1, "mm")), size = 1) +
  scale_color_manual(values = c("hi" = "#F8766D", "low" = "#00BFC4")) +
   guides(colour = guide_legend(title = "uPC1 Category"), fill = "none", linewidth = "none") 
   
  
fplotfinal <- fplot    + theme_classic() + scale_linewidth_continuous(range = c(.001, .85)) +
 facet_wrap(~Vowel, nrow = 2) +
  theme(
    axis.title = element_text(size = 6),  
    axis.text = element_text(size = 6), 
    legend.position = "bottom",
    legend.title = element_text(size = 6),
    legend.text = element_text(size = 6)  
  ) +
   ggtitle("Women")
  1. Save
Click here to view code.
ggsave(here( "Figures", "Plots", "uPCA", "lowhighUPC1TrajectorieswithInt.pdf"),  width= 11, height= 12.5,units="cm")
  1. Same plot, but using data from men
Click here to view code.
malemono = monophthongs %>% filter(participant_gender == "M")
maleseq = predictions %>% filter(participant_gender == "M")

mplot <- malemono %>%
  ggplot(aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, colour = Target.teAkaSegment)) +
   stat_ellipse(level = 0.67, geom = "polygon", alpha = 0.1, aes(fill = Target.teAkaSegment), show.legend = FALSE) +
  scale_x_reverse() + scale_y_reverse() +
   scale_fill_grey(start = 0.1, end = 0.9) +
    geom_text(data= monophthong_means,
            aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, label = Target.teAkaSegment),  show.legend = FALSE, size = 2)  +
 geom_path(data = maleseq, aes(
    x = F2_lobanov_2.0,
    y = F1_lobanov_2.0,
    colour = PC1cat, linewidth = Intensity),  
    size = 1, show.legend = TRUE,
    arrow = arrow(length = unit(1, "mm")), size = 1) +
  scale_color_manual(values = c("hi" = "#F8766D", "low" = "#00BFC4")) +
   guides(colour = guide_legend(title = "uPC1 Category"), fill = "none", linewidth = "none") 
   
  
mplotfinal <- mplot    + theme_classic() + scale_linewidth_continuous(range = c(.001, .85)) +
 facet_wrap(~Vowel, nrow = 2) +
  theme(
    axis.title = element_text(size = 6),  
    axis.text = element_text(size = 6), 
    legend.position = "bottom",
    legend.title = element_text(size = 6),
    legend.text = element_text(size = 6)  
  ) +
   ggtitle("Men")
Click here to view code.
Trajplotcombined <- cowplot::plot_grid(fplotfinal, mplotfinal,  
                            labels = c("a", "b"), ncol = 2, align = "c", axis = "l")

Trajplotcombined  

Click here to view code.
ggsave(here( "Figures", "Plots", "uPCA", "lowhighUPC1TrajectorieswithIntCombined.pdf"), Trajplotcombined,  width= 20, height= 12.5,units="cm")

9 Are the different trajectories for high and low uPC1 tokens a product of different monophthong spaces? (Manuscript footnote 7)

As mentioned in Footnote 7 of the manuscript, it could be possible that speakers with predominantly high uPC1 scores and predominantly low uPC1 scores have different monophthong spaces, and that the different trajectories we see between high and low uPC1 tokens are actually a reflection of these differences. To investigate this, we plot the vowel spaces of men and women who predominantly low uPC1 scores. The following chunks provide the code.

  1. Read in data if need be. This section uses results_extreme_all data frame and pc_formants_results_all, defined in Section 8.4
Click here to view code.
monophthongs = read.csv(here("Data", "monophthongsfinal.csv"))  
  1. Count number of high and low scoring tokens per speaker
Click here to view code.
per_speaker_PC_results_overlall  <- results_extreme_all %>% 
  filter(PC1cat != "mid") %>% 
  select(MatchId, Speaker, PC1cat, sequence) %>% 
  group_by(Speaker,   PC1cat) %>% 
  count()
  1. Essentially pivot the data
Click here to view code.
per_speaker_PC_results_counts <- per_speaker_PC_results_overlall %>% 
group_by(Speaker, PC1cat) %>% 
  summarise(n = sum(n), .groups = "drop") %>%
  pivot_wider(names_from = PC1cat, values_from = n, values_fill = list(n = 0))

colnames(per_speaker_PC_results_counts) <- c("Speaker", "hi_n", "low_n")
  1. Determine if the have more or high low scoring tokens, or if its a tie
Click here to view code.
per_speaker_PC_results_counts <- per_speaker_PC_results_counts %>%
  mutate(predominant_PC1cat = case_when(
    hi_n > low_n ~ "hi",
    hi_n < low_n ~ "low",
    TRUE ~ "tie" 
  ))
  1. Combine with monophthongs, filter out tokens from speakers with tied high and low tokens.
Click here to view code.
monophthongs <- left_join(monophthongs, per_speaker_PC_results_counts) %>% 
   filter(predominant_PC1cat != "tie") 
  1. Combine with sequences data
Click here to view code.
sequences <- left_join(pc_formants_results_all, per_speaker_PC_results_counts, by = "Speaker")   
  1. Do some data prep for the sequences data
Click here to view code.
sequences$participant_gender = as.factor(sequences$participant_gender)
sequences$category = as.factor(sequences$category)
sequences$Vowel = as.factor(sequences$Vowel)

sequences$category_gender = interaction(sequences$participant_gender, sequences$category)

sequences <- left_join(sequences, per_speaker_PC_results_counts)

This may not be the best way of doing things, but we create separate data frames for the sequences+ monopthongs of high and low scoring speakers, and then plot the sequence trajectories using GAMs.

Click here to view code.
high_scoring_sequences <- sequences %>% 
  filter(predominant_PC1cat == "hi") 

low_scoring_sequences <- sequences %>% 
  filter(predominant_PC1cat == "low") 



high_scoring_mono <- monophthongs %>% 
    filter(predominant_PC1cat == "hi") 

low_scoring_mono <-  monophthongs %>% 
  filter(predominant_PC1cat == "low") 

9.1 High scoring speakers only, men and women

  1. View data for high scoring seqs
Click here to view code.
vowels <- high_scoring_sequences

 
vowels %>%
  head(10) %>%
  kable() %>%
  kable_styling(font_size = 11) %>%
  scroll_box(width = "100%")
X.3 sequence MatchId F1..fPC1 F1..fPC2 F1..fPC3 F2..fPC1 F2..fPC2 F2..fPC3 Pitch..fPC1 Pitch..fPC2 Pitch..fPC3 Intensity..fPC1 Intensity..fPC2 Intensity..fPC3 Duration..z.scored PC1 PC2 PC3 PC4 X.2 X.1 X Corpus Speaker category participant_gender Before.Match Text After.Match Target.word Target.orthography Target.vowelCluster Target.vowelCluster.start Target.vowelCluster.end joincode word word.alt.format final stress moraPosition complex Language participant_language PC1cat Vowel time F1_lobanov_2.0 F2_lobanov_2.0 hi_n low_n predominant_PC1cat category_gender
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 1 0.2697415 0.4512961 66 27 hi M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 2 0.9771713 0.6559407 66 27 hi M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 3 1.4925845 0.6381455 66 27 hi M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 4 1.7654503 0.3334030 66 27 hi M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 5 2.0989529 0.1443292 66 27 hi M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 6 1.9271485 -0.3383652 66 27 hi M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 7 1.8564055 -0.4028727 66 27 hi M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 8 1.5936459 -0.1737597 66 27 hi M.PresentElder
3 ea g_10;em_12_707;n_31354-n_31355;p_28;#=ew_69_149873;prefix=00524-;[0]=ew_0_6337 1.4364627 0.2993751 0.0397453 -0.9850424 0.3894143 -0.0055354 31.600232 6.860915 -4.461722 -0.8902482 10.481214 4.386573 0.3373410 -1.488767 0.1477485 1.033077 -0.2318555 68 110 112 MAONZE K001M PresentElder M he mea tauhou mea mea ea 100.697 100.877 mea ea mea mea TRUE yes 1 no M M low ea 9 2.0282099 -0.1448426 66 27 hi M.PresentElder
4 ea g_10;em_12_710;n_31357-n_31358;p_28;#=ew_69_149890;prefix=00532-;[0]=ew_0_6365 -0.2938114 -0.0357030 -0.3236411 0.0990935 -0.0026037 0.3933920 9.087662 -7.878749 -1.953018 -5.2253531 -3.810278 2.256708 -0.3274888 1.104122 0.2901737 0.623884 0.0639671 70 112 114 MAONZE K001M PresentElder M ngaa mea katoa mea mea ea 111.275 111.405 mea ea mea mea TRUE yes 1 no M M hi ea 1 0.5426073 0.4090325 66 27 hi M.PresentElder
  1. Pivot data
Click here to view code.
vowels <- vowels %>%
  pivot_longer(
    cols = F1_lobanov_2.0:F2_lobanov_2.0, # Select the columns to turn into rows.
    names_to = "Formant", # Name the column to indicate if data is F1 or F2,
    values_to = "Frequency"
  )
  1. Nest data
Click here to view code.
vowels <- vowels %>%
  group_by(Vowel, Formant, PC1cat) %>%
  nest()
  1. Fit GAMs to the data
Click here to view code.
vowels <- vowels %>%
  mutate(
    model = map(
      data, # We are applying a function to the entries of the `data` column.
      # This is the function we are applying (introduced with a ~)
      ~ bam( 
        # Here's our formula.
        Frequency ~ participant_gender +
          s(time, by=participant_gender, k=5),
        data = .x, # Here's our pronoun.
        # Then some arguments to speed up the model fit.
        method = 'fREML',
        discrete = TRUE,
        nthreads = 2
      )
    )
  )
  1. Get predictions
Click here to view code.
 to_predict <- list(
  "time" = seq(from=1, to=9, by=1), # All years
  "participant_gender" = c("M", "F")
) 
# BTW: Get prediction will just assume the average value for any predictors not
# mentioned (in this case, Speech_rate).

vowels <- vowels %>%
  mutate(
    prediction = map(
      model, # This time we're applying the function to all the models.
      # We again introduce the function with '~', and indicate where the model 
      # goes with '.x'.
      ~ get_predictions(model = .x, cond = to_predict, print.summary = FALSE)
    )
  )
  1. View predictions
Click here to view code.
vowels$prediction[[1]] %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
participant_gender time fit CI
M 1 0.5800590 0.1526756
F 1 0.7463039 0.1813609
M 2 1.0391641 0.0987235
F 2 1.1826107 0.1203777
M 3 1.4379810 0.1051796
F 3 1.6225532 0.1297158
  1. Formant predictions
Click here to view code.
predictions <- vowels %>%
  select(
    Vowel, Formant, PC1cat, prediction
  ) %>%
  unnest(prediction)

predictions %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
Vowel Formant PC1cat participant_gender time fit CI
ea F1_lobanov_2.0 low M 1 0.5800590 0.1526756
ea F1_lobanov_2.0 low F 1 0.7463039 0.1813609
ea F1_lobanov_2.0 low M 2 1.0391641 0.0987235
ea F1_lobanov_2.0 low F 2 1.1826107 0.1203777
ea F1_lobanov_2.0 low M 3 1.4379810 0.1051796
ea F1_lobanov_2.0 low F 3 1.6225532 0.1297158
Click here to view code.
predictions <- predictions %>%
  select( # Remove unneeded variables
    -CI
  ) %>%
  pivot_wider( # Pivot
    names_from = Formant,
    values_from = fit
  )

predictions %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
Vowel PC1cat participant_gender time F1_lobanov_2.0 F2_lobanov_2.0
ea low M 1 0.5800590 0.7383871
ea low F 1 0.7463039 1.1363690
ea low M 2 1.0391641 0.6737784
ea low F 2 1.1826107 1.1063994
ea low M 3 1.4379810 0.5386139
ea low F 3 1.6225532 0.9631273
  1. More predictions formatting
Click here to view code.
predictions$Vowelcat = paste(predictions$Vowel,predictions$PC1cat)


first_obs <- predictions %>%
  group_by(Vowelcat, participant_gender) %>%
  slice(which.min(time))
  1. Calculate means to label monophthong ellipses
Click here to view code.
i_means <- monophthongs %>% 
  filter(Target.teAkaSegment == "i") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
e_means <- monophthongs %>% 
  filter(Target.teAkaSegment == "e") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
a_means <- monophthongs %>% 
  filter(Target.teAkaSegment == "a") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
o_means <- monophthongs %>% 
  filter(Target.teAkaSegment == "o") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  

u_means <- monophthongs %>% 
  filter(Target.teAkaSegment == "u") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
monophthong_means <- rbind(i_means, e_means, a_means, o_means, u_means) %>% 
  rename(F1_lobanov_2.0 = meanF1) %>% 
  rename(F2_lobanov_2.0 = meanF2)
  1. Plot women
Click here to view code.
femalemono = high_scoring_mono %>% filter(participant_gender == "F")
femaleseq = predictions %>% filter(participant_gender == "F")

fplot <- femalemono %>%
  ggplot(aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, colour = Target.teAkaSegment)) +
   stat_ellipse(level = 0.67, geom = "polygon", alpha = 0.1, aes(fill = Target.teAkaSegment), show.legend = FALSE) +
  scale_x_reverse() + scale_y_reverse() +
   scale_fill_grey(start = 0.1, end = 0.9) +
    geom_text(data= monophthong_means,
            aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, label = Target.teAkaSegment),  show.legend = FALSE, size = 2)  +
 geom_path(data = femaleseq, aes(
    x = F2_lobanov_2.0,
    y = F1_lobanov_2.0,
    colour = PC1cat),  
    size = 1, show.legend = TRUE,
    arrow = arrow(length = unit(1, "mm")), size = 1) +
  scale_color_manual(values = c("hi" = "#F8766D", "low" = "#00BFC4")) +
   guides(colour = guide_legend(title = "uPC1 Category"), fill = "none", linewidth = "none") 
   
  
fplot    + theme_classic() + 
 facet_wrap(~Vowel, nrow = 2) +
  labs(title = "Sequences and monopthongs: women with predominantely high uPC1 scores") +
  theme(
    text = element_text(size = 6),
    legend.position = "bottom"
  )

  1. Plot men
Click here to view code.
malemono = high_scoring_mono %>% filter(participant_gender == "M")
maleseq = predictions %>% filter(participant_gender == "M")

mplot <- malemono %>%
  ggplot(aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, colour = Target.teAkaSegment)) +
   stat_ellipse(level = 0.67, geom = "polygon", alpha = 0.1, aes(fill = Target.teAkaSegment), show.legend = FALSE) +
  scale_x_reverse() + scale_y_reverse() +
   scale_fill_grey(start = 0.1, end = 0.9) +
    geom_text(data= monophthong_means,
            aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, label = Target.teAkaSegment),  show.legend = FALSE, size = 2)  +
 geom_path(data = maleseq, aes(
    x = F2_lobanov_2.0,
    y = F1_lobanov_2.0,
    colour = PC1cat),  
    size = 1, show.legend = TRUE,
    arrow = arrow(length = unit(1, "mm")), size = 1) +
  scale_color_manual(values = c("hi" = "#F8766D", "low" = "#00BFC4")) +
   guides(colour = guide_legend(title = "uPC1 Category"), fill = "none", linewidth = "none") 
   
  
mplot    + theme_classic()+ 
 facet_wrap(~Vowel, nrow = 2) +
  labs(title = "Sequences and monopthongs: men with predominantely high uPC1 scores") +
  theme(
    text = element_text(size = 6),
    legend.position = "bottom"
  )

9.2 Low scoring speakers only, men and women

  1. View data for low scoring seqs
Click here to view code.
vowels <- low_scoring_sequences

 
vowels %>%
  head(10) %>%
  kable() %>%
  kable_styling(font_size = 11) %>%
  scroll_box(width = "100%")
X.3 sequence MatchId F1..fPC1 F1..fPC2 F1..fPC3 F2..fPC1 F2..fPC2 F2..fPC3 Pitch..fPC1 Pitch..fPC2 Pitch..fPC3 Intensity..fPC1 Intensity..fPC2 Intensity..fPC3 Duration..z.scored PC1 PC2 PC3 PC4 X.2 X.1 X Corpus Speaker category participant_gender Before.Match Text After.Match Target.word Target.orthography Target.vowelCluster Target.vowelCluster.start Target.vowelCluster.end joincode word word.alt.format final stress moraPosition complex Language participant_language PC1cat Vowel time F1_lobanov_2.0 F2_lobanov_2.0 hi_n low_n predominant_PC1cat category_gender
15 ea g_1007;em_12_95259;n_108219-n_108220;p_284;#=ew_69_210492;prefix=58163-;[0]=ew_0_623659 1.8414877 0.186432 -0.2839358 -0.6724291 0.5781306 -0.4208177 -12.120353 -4.034826 0.8405222 9.772280 0.587162 -0.2066952 0.0714091 -1.031297 -0.8540191 -0.0800264 0.1915901 8215 13981 14191 MAONZE MU01M Historical M e mea ko mea mea ea 95.245 95.405 mea ea mea mea TRUE yes 1 no M M low ea 1 0.5373210 1.2388271 20 28 low M.Historical
15 ea g_1007;em_12_95259;n_108219-n_108220;p_284;#=ew_69_210492;prefix=58163-;[0]=ew_0_623659 1.8414877 0.186432 -0.2839358 -0.6724291 0.5781306 -0.4208177 -12.120353 -4.034826 0.8405222 9.772280 0.587162 -0.2066952 0.0714091 -1.031297 -0.8540191 -0.0800264 0.1915901 8215 13981 14191 MAONZE MU01M Historical M e mea ko mea mea ea 95.245 95.405 mea ea mea mea TRUE yes 1 no M M low ea 2 1.1987973 0.7442307 20 28 low M.Historical
15 ea g_1007;em_12_95259;n_108219-n_108220;p_284;#=ew_69_210492;prefix=58163-;[0]=ew_0_623659 1.8414877 0.186432 -0.2839358 -0.6724291 0.5781306 -0.4208177 -12.120353 -4.034826 0.8405222 9.772280 0.587162 -0.2066952 0.0714091 -1.031297 -0.8540191 -0.0800264 0.1915901 8215 13981 14191 MAONZE MU01M Historical M e mea ko mea mea ea 95.245 95.405 mea ea mea mea TRUE yes 1 no M M low ea 3 1.7279783 0.3170793 20 28 low M.Historical
15 ea g_1007;em_12_95259;n_108219-n_108220;p_284;#=ew_69_210492;prefix=58163-;[0]=ew_0_623659 1.8414877 0.186432 -0.2839358 -0.6724291 0.5781306 -0.4208177 -12.120353 -4.034826 0.8405222 9.772280 0.587162 -0.2066952 0.0714091 -1.031297 -0.8540191 -0.0800264 0.1915901 8215 13981 14191 MAONZE MU01M Historical M e mea ko mea mea ea 95.245 95.405 mea ea mea mea TRUE yes 1 no M M low ea 4 2.3172936 0.2833568 20 28 low M.Historical
15 ea g_1007;em_12_95259;n_108219-n_108220;p_284;#=ew_69_210492;prefix=58163-;[0]=ew_0_623659 1.8414877 0.186432 -0.2839358 -0.6724291 0.5781306 -0.4208177 -12.120353 -4.034826 0.8405222 9.772280 0.587162 -0.2066952 0.0714091 -1.031297 -0.8540191 -0.0800264 0.1915901 8215 13981 14191 MAONZE MU01M Historical M e mea ko mea mea ea 95.245 95.405 mea ea mea mea TRUE yes 1 no M M low ea 5 1.8482468 0.0754015 20 28 low M.Historical
15 ea g_1007;em_12_95259;n_108219-n_108220;p_284;#=ew_69_210492;prefix=58163-;[0]=ew_0_623659 1.8414877 0.186432 -0.2839358 -0.6724291 0.5781306 -0.4208177 -12.120353 -4.034826 0.8405222 9.772280 0.587162 -0.2066952 0.0714091 -1.031297 -0.8540191 -0.0800264 0.1915901 8215 13981 14191 MAONZE MU01M Historical M e mea ko mea mea ea 95.245 95.405 mea ea mea mea TRUE yes 1 no M M low ea 6 1.2228510 -0.0819700 20 28 low M.Historical
15 ea g_1007;em_12_95259;n_108219-n_108220;p_284;#=ew_69_210492;prefix=58163-;[0]=ew_0_623659 1.8414877 0.186432 -0.2839358 -0.6724291 0.5781306 -0.4208177 -12.120353 -4.034826 0.8405222 9.772280 0.587162 -0.2066952 0.0714091 -1.031297 -0.8540191 -0.0800264 0.1915901 8215 13981 14191 MAONZE MU01M Historical M e mea ko mea mea ea 95.245 95.405 mea ea mea mea TRUE yes 1 no M M low ea 7 2.3654009 -0.0707292 20 28 low M.Historical
15 ea g_1007;em_12_95259;n_108219-n_108220;p_284;#=ew_69_210492;prefix=58163-;[0]=ew_0_623659 1.8414877 0.186432 -0.2839358 -0.6724291 0.5781306 -0.4208177 -12.120353 -4.034826 0.8405222 9.772280 0.587162 -0.2066952 0.0714091 -1.031297 -0.8540191 -0.0800264 0.1915901 8215 13981 14191 MAONZE MU01M Historical M e mea ko mea mea ea 95.245 95.405 mea ea mea mea TRUE yes 1 no M M low ea 8 NA 0.0135770 20 28 low M.Historical
15 ea g_1007;em_12_95259;n_108219-n_108220;p_284;#=ew_69_210492;prefix=58163-;[0]=ew_0_623659 1.8414877 0.186432 -0.2839358 -0.6724291 0.5781306 -0.4208177 -12.120353 -4.034826 0.8405222 9.772280 0.587162 -0.2066952 0.0714091 -1.031297 -0.8540191 -0.0800264 0.1915901 8215 13981 14191 MAONZE MU01M Historical M e mea ko mea mea ea 95.245 95.405 mea ea mea mea TRUE yes 1 no M M low ea 9 NA 0.1709486 20 28 low M.Historical
197 ea g_1051;em_12_97738;n_109566-n_109567;p_203;#=ew_69_241754;prefix=87824-;[0]=ew_0_649005 -0.9214995 1.478383 0.0683188 -2.0008984 -0.3725911 -0.7364066 -5.064278 -5.130406 5.8262860 7.863936 3.506005 -0.0794503 1.0021708 -1.281185 -0.8619286 -0.3166463 -0.0986521 12711 21281 21623 MAONZE WU02M Historical F ko Aotea . Kurahaupo: - Aotea . aotea ea 145.551 145.781 aotea ea aotea aotea TRUE no 3 no M M low ea 1 -0.5425697 NA 2 6 low F.Historical
  1. Pivot data
Click here to view code.
vowels <- vowels %>%
  pivot_longer(
    cols = F1_lobanov_2.0:F2_lobanov_2.0, # Select the columns to turn into rows.
    names_to = "Formant", # Name the column to indicate if data is F1 or F2,
    values_to = "Frequency"
  )
  1. Nest data
Click here to view code.
vowels <- vowels %>%
  group_by(Vowel, Formant, PC1cat) %>%
  nest()
  1. Fit GAMs to the data
Click here to view code.
vowels <- vowels %>%
  mutate(
    model = map(
      data, # We are applying a function to the entries of the `data` column.
      # This is the function we are applying (introduced with a ~)
      ~ bam( 
        # Here's our formula.
        Frequency ~ participant_gender +
          s(time, by=participant_gender, k=5),
        data = .x, # Here's our pronoun.
        # Then some arguments to speed up the model fit.
        method = 'fREML',
        discrete = TRUE,
        nthreads = 2
      )
    )
  )
  1. Get predictions
Click here to view code.
 to_predict <- list(
  "time" = seq(from=1, to=9, by=1), # All years
  "participant_gender" = c("M", "F")
) 
# BTW: Get prediction will just assume the average value for any predictors not
# mentioned (in this case, Speech_rate).

vowels <- vowels %>%
  mutate(
    prediction = map(
      model, # This time we're applying the function to all the models.
      # We again introduce the function with '~', and indicate where the model 
      # goes with '.x'.
      ~ get_predictions(model = .x, cond = to_predict, print.summary = FALSE)
    )
  )
  1. View predictions
Click here to view code.
vowels$prediction[[1]] %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
participant_gender time fit CI
M 1 0.8508458 0.1339840
F 1 0.7254217 0.1083475
M 2 1.4081336 0.0899359
F 2 1.2417965 0.0719859
M 3 1.8738094 0.0978850
F 3 1.6981314 0.0780793
  1. Format predictions
Click here to view code.
predictions <- vowels %>%
  select(
    Vowel, Formant, PC1cat, prediction
  ) %>%
  unnest(prediction)

predictions %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
Vowel Formant PC1cat participant_gender time fit CI
ea F1_lobanov_2.0 low M 1 0.8508458 0.1339840
ea F1_lobanov_2.0 low F 1 0.7254217 0.1083475
ea F1_lobanov_2.0 low M 2 1.4081336 0.0899359
ea F1_lobanov_2.0 low F 2 1.2417965 0.0719859
ea F1_lobanov_2.0 low M 3 1.8738094 0.0978850
ea F1_lobanov_2.0 low F 3 1.6981314 0.0780793
Click here to view code.
predictions <- predictions %>%
  select( # Remove unneeded variables
    -CI
  ) %>%
  pivot_wider( # Pivot
    names_from = Formant,
    values_from = fit
  )

predictions %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
Vowel PC1cat participant_gender time F1_lobanov_2.0 F2_lobanov_2.0
ea low M 1 0.8508458 0.6296614
ea low F 1 0.7254217 0.8633470
ea low M 2 1.4081336 0.4215653
ea low F 2 1.2417965 0.7065416
ea low M 3 1.8738094 0.2011722
ea low F 3 1.6981314 0.4800903
  1. More predictions formatting
Click here to view code.
predictions$Vowelcat = paste(predictions$Vowel,predictions$PC1cat)


first_obs <- predictions %>%
  group_by(Vowelcat, participant_gender) %>%
  slice(which.min(time))
  1. Plot women
Click here to view code.
femalemono = low_scoring_mono %>% filter(participant_gender == "F")
femaleseq = predictions %>% filter(participant_gender == "F")

fplot <- femalemono %>%
  ggplot(aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, colour = Target.teAkaSegment)) +
   stat_ellipse(level = 0.67, geom = "polygon", alpha = 0.1, aes(fill = Target.teAkaSegment), show.legend = FALSE) +
  scale_x_reverse() + scale_y_reverse() +
   scale_fill_grey(start = 0.1, end = 0.9) +
    geom_text(data= monophthong_means,
            aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, label = Target.teAkaSegment),  show.legend = FALSE, size = 2)  +
 geom_path(data = femaleseq, aes(
    x = F2_lobanov_2.0,
    y = F1_lobanov_2.0,
    colour = PC1cat),  
    size = 1, show.legend = TRUE,
    arrow = arrow(length = unit(1, "mm")), size = 1) +
  scale_color_manual(values = c("hi" = "#F8766D", "low" = "#00BFC4")) +
   guides(colour = guide_legend(title = "uPC1 Category"), fill = "none", linewidth = "none") 
   
  
fplot    + theme_classic() + 
 facet_wrap(~Vowel, nrow = 2) +
  labs(title = "Sequences and monopthongs: women with predominantely low uPC1 scores") +
  theme(
    text = element_text(size = 6),
    legend.position = "bottom"
  )

  1. Plot men
Click here to view code.
malemono = low_scoring_mono %>% filter(participant_gender == "M")
maleseq = predictions %>% filter(participant_gender == "M")

mplot <- malemono %>%
  ggplot(aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, colour = Target.teAkaSegment)) +
   stat_ellipse(level = 0.67, geom = "polygon", alpha = 0.1, aes(fill = Target.teAkaSegment), show.legend = FALSE) +
  scale_x_reverse() + scale_y_reverse() +
   scale_fill_grey(start = 0.1, end = 0.9) +
    geom_text(data= monophthong_means,
            aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, label = Target.teAkaSegment),  show.legend = FALSE, size = 2)  +
 geom_path(data = maleseq, aes(
    x = F2_lobanov_2.0,
    y = F1_lobanov_2.0,
    colour = PC1cat),  
    size = 1, show.legend = TRUE,
    arrow = arrow(length = unit(1, "mm")), size = 1) +
  scale_color_manual(values = c("hi" = "#F8766D", "low" = "#00BFC4")) +
   guides(colour = guide_legend(title = "uPC1 Category"), fill = "none", linewidth = "none") 
   
  
mplot    + theme_classic()+ 
 facet_wrap(~Vowel, nrow = 2) +
  labs(title = "Sequences and monopthongs: men with predominantely low uPC1 scores") +
  theme(
    text = element_text(size = 6),
    legend.position = "bottom"
  )

10 Regression analysis (Manuscript §4.2)

10.1 Custom functions

  1. Function to get the local mean monophthong duration within a window of X seconds (default 10) either side of a target timestamp in a target transcript
Click here to view code.
 local_mean_duration = function(target_transcript, target_timestamp, window=10) {
  monopthong_dat %>%
    filter(transcript == target_transcript, abs(target_timestamp - timestamp) <= window) %>%
    pull(duration) %>%
    mean(.)
}
  1. Function to center variables
Click here to view code.
c. <- function (x) scale(x, scale = FALSE)
  1. Function to calculate VIFs and display them in a table
Click here to view code.
display_vif = function(mod, output_kable=TRUE, ...) {
  table <- vif(mod, type="terms")
  # Check if VIFs or GVIFs have been calculated
  if (is.null(dim(table))) {
    table <- vif_table(table, output_kable, ...)
  } else {
    table <- gvif_table(table, output_kable, ...)
  }
  return(table)
}
  1. Function to neatly display a VIF table
Click here to view code.
vif_table = function(table, output_kable=TRUE, ...) {
  table = table %>%
    data.frame() %>%
    rlang::set_names(c("vif")) %>%
    rownames_to_column("parameter") %>%
    mutate(
      parameter = parameter %>%
        str_replace_all(
          .,
          "(?<=^|\\:)(?:c\\.\\()([^:]+)(?:\\))(?=$|\\:)",
          "\\1 (centered)"
        ) %>%
        str_replace_all(., fixed(":"), " &times; ")
    )
  if (output_kable) {
    table = table %>%
    kable(digits=3, escape=F, col.names=c("Parameter", "VIF"), align="lr", ...) %>%
    kable_styling()
  }
  return(table)
}
  1. Function to neatly display a GVIF table
Click here to view code.
gvif_table = function(table, output_kable=TRUE, ...) {
  table = table %>%
    data.frame() %>%
    rlang::set_names(c("gvif", "df", "transformed")) %>%
    rownames_to_column("parameter") %>%
    mutate(
      parameter = parameter %>%
        str_replace_all(
          .,
          "(?<=^|\\:)(?:c\\.\\()([^:]+)(?:\\))(?=$|\\:)",
          "\\1 (centered)"
        ) %>%
        str_replace_all(., fixed(":"), " &times; "),
      transformed = transformed ^ 2
    )
  if (output_kable) {
    table = table %>%
    kable(digits=3, escape=F, col.names=c("Parameter", "GVIF", "df", "Transformed GVIF"), align="lrrr", ...) %>%
    kable_styling()
  }
  return(table)
}
  1. Function to create table of the regression results with the Estimate, SE, df, t, and p values rounded to 3 decimal places
Click here to view code.
format_lmer_table <- function(model, digits = 3) {
  model_summary <- summary(model)

  coefs <- as.data.frame(coef(summary(model)))
  
  coefs <- coefs %>%
    rename(Estimate = Estimate, SE = `Std. Error`, df = `df`, 
           t = `t value`, p = `Pr(>|t|)`) %>%
    mutate(
      across(c(Estimate, SE, t), ~ round(.x, digits)),   
      df = round(df, 0),  
      p = ifelse(p < 0.001, "<0.001", sprintf(paste0("%.", digits, "f"), p))  
    )
  
  return(coefs)
}

10.2 Calculate local speech rate for each sequence token

This code is used to determine the local speech rate measures used in the regression analyses. Used to determine the mean duration of monophthongs in a transcript within a window of 10 seconds either side of a given sequence.

  1. Monophthongs data if needed
Click here to view code.
monophthongs = read.csv(here("Data", "monophthongsfinal.csv"))
  1. Calculate monophthong duration
Click here to view code.
monophthongs$duration  =  monophthongs$Target.teAkaSegment.end - monophthongs$Target.teAkaSegment.start

mono <- monophthongs %>% 
  select(Transcript, Speaker, duration, Target.teAkaSegment.start)


monopthong_dat <-  mono %>% 
  rename(timestamp = Target.teAkaSegment.start) %>% 
  rename(transcript = Transcript)
  1. Add local speech rate (using function defined above) for /ia/ tokens + save data frame
Click here to view code.
ia <- read.csv(here("Data", "ia_uPCAresults.csv")) %>% 
  left_join(
        read.csv(here("Data", "MAONZE_opening_seqs.csv"), header=TRUE, encoding="UTF-8") %>% 
          select(Transcript, MatchId, Target.vowelCluster.start) 
      )

ia <-  ia %>% 
  rename(target_timestamp = Target.vowelCluster.start) %>% 
  rename(target_transcript = Transcript)


ia <- ia %>% 
 mutate(
    mean_rate = map2_dbl(ia$target_transcript, ia$target_timestamp, local_mean_duration, window = 10)
  )

 ia <- ia %>% 
  drop_na(mean_rate)

write.csv(ia, here("Data","ia_PC_results_local_rate.csv"))
  1. Add local speech rate for /ea/ tokens + save data frame
Click here to view code.
ea <- read.csv(here("Data", "ea_uPCAresults.csv")) %>% 
  left_join(
        read.csv(here("Data", "MAONZE_opening_seqs.csv"), header=TRUE, encoding="UTF-8") %>% 
          select(Transcript, MatchId, Target.vowelCluster.start) 
      )

ea <-  ea %>% 
  rename(target_timestamp = Target.vowelCluster.start) %>% 
  rename(target_transcript = Transcript)


ea <- ea %>% 
 mutate(
    mean_rate = map2_dbl(ea$target_transcript, ea$target_timestamp, local_mean_duration, window = 10)
  )

 ea <- ea %>% 
  drop_na(mean_rate)

write.csv(ea, here("Data","ea_PC_results_local_rate.csv"))
  1. Add local speech rate for /oa/ tokens + save data frame
Click here to view code.
oa <- read.csv(here("Data", "oa_uPCAresults.csv")) %>% 
  left_join(
        read.csv(here("Data", "MAONZE_opening_seqs.csv"), header=TRUE, encoding="UTF-8") %>% 
          select(Transcript, MatchId, Target.vowelCluster.start) 
      )

oa <-  oa %>% 
  rename(target_timestamp = Target.vowelCluster.start) %>% 
  rename(target_transcript = Transcript)


oa <- oa %>% 
 mutate(
    mean_rate = map2_dbl(oa$target_transcript,oa$target_timestamp, local_mean_duration, window = 10)
  )

 oa <- oa %>% 
  drop_na(mean_rate)

write.csv(oa, here("Data","oa_PC_results_local_rate.csv"))
  1. Add local speech rate for /ua/ tokens + save data frame
Click here to view code.
ua <- read.csv(here("Data", "ua_uPCAresults.csv")) %>% 
  left_join(
        read.csv(here("Data", "MAONZE_opening_seqs.csv"), header=TRUE, encoding="UTF-8") %>% 
          select(Transcript, MatchId, Target.vowelCluster.start) 
      )

ua <-  ua %>% 
  rename(target_timestamp = Target.vowelCluster.start) %>% 
  rename(target_transcript = Transcript)


ua <- ua %>% 
 mutate(
    mean_rate = map2_dbl(ua$target_transcript,ua$target_timestamp, local_mean_duration, window = 10)
  )

 ua <- ua %>% 
  drop_na(mean_rate)

write.csv(ua, here("Data","ua_PC_results_local_rate.csv"))

10.3 /ia/ regression model

  1. Read in data, create phonological form trackers
Click here to view code.
ia = read.csv(here("Data","ia_PC_results_local_rate.csv"), header=TRUE, encoding="UTF-8", row.names=1) %>%
  # merge pause data
  left_join(
    read.csv(here("Data", "pause_info.csv"), header=TRUE, encoding="UTF-8", row.names=1),
    by = "MatchId"
  ) %>%
  # create phonological form trackers
  mutate(
    phon.word = word %>% 
      str_replace("([AEIOU])\\1", "\\1") %>%
      str_replace(fixed("wh"), "f") %>%
      str_replace(fixed("ng"), "N"),
    prev_c = str_extract(phon.word, ".(?=ia)"),
    prev_c_tongue = case_when(
      prev_c %in% c("p", "m", "f", "h") ~ "neutral",
      prev_c %in% c("t", "n", "r") ~ "coronal",
      prev_c %in% c("k", "N", "w") ~ "dorsal"
    )
  )
  1. Set up factors as required
Click here to view code.
ia = ia %>%
  mutate(
    category = factor(category, levels=c("Historical", "PresentElder", "L1", "L2")),
    stress = factor(stress == "yes"),
    participant_gender = factor(participant_gender, levels=c("M", "F")),
    complex = factor(complex == "yes"),
    final = factor(final == "TRUE"),
    prev_c_tongue = factor(prev_c_tongue, levels=c("neutral", "coronal", "dorsal")),
    moraPositionFactor = ifelse(moraPosition > 2, "3+", moraPosition),
    moraPositionFactor = factor(moraPositionFactor, levels=c("1", "2", "3+")))
  1. Set up contrasts for factors
Click here to view code.
contrasts(ia$category) = matrix(c(c(-1,1,0,0)/2, c(-1,-1,1,1)/2, c(0,0,-1,1)/2), ncol=3)
colnames(contrasts(ia$category)) = c("|PresentElder.v.Historical", "|L1L2.v.HistoricalPresentElder", "|L2.v.L1")
contrasts(ia$stress) = contr.helmert(2)
colnames(contrasts(ia$stress)) = c("|y.v.n")
contrasts(ia$participant_gender) = contr.helmert(2)
colnames(contrasts(ia$participant_gender)) = c("|F.v.M")
contrasts(ia$complex) = contr.helmert(2)
colnames(contrasts(ia$complex)) = c("|y.v.n")
contrasts(ia$final) = contr.helmert(2)
colnames(contrasts(ia$final)) = c("|y.v.n")
contrasts(ia$prev_c_tongue) = contr.treatment(3) - 1/3
colnames(contrasts(ia$prev_c_tongue)) = c("|coronal.v.neutral", "|dorsal.v.neutral")
contrasts(ia$moraPositionFactor) <- contr.treatment(3)
  1. Bin pause data
Click here to view code.
ia = ia %>%
mutate(
  pause_bin = factor(pause_length > 0.25, levels=c(FALSE, TRUE)) )  
  1. Set up final_pause annotations and define contrasts
Click here to view code.
ia <- ia %>% 
  mutate(final_pause  = case_when(
    final == TRUE & pause_bin == TRUE ~ TRUE,
    final == TRUE & pause_bin == FALSE ~ FALSE,
    final == FALSE & pause_bin == TRUE ~ FALSE,
    final == FALSE & pause_bin == FALSE ~ FALSE,
  ))

contrasts(ia$final_pause) = contr.helmert(2)
colnames(contrasts(ia$final_pause)) = c("|y.v.n")
  1. Inverse transform mean_rate, then remove potential leverage points <= 5 > 31
Click here to view code.
ia <-  ia %>% 
  mutate(mean_rate_transf = 1/mean_rate)  %>%
  filter(mean_rate_transf > 5, mean_rate_transf <  31)

The inverse transformation is due to the data skew, which is shown below. There various tokens of very slow speech that could be leverage points.

Click here to view code.
with(ia, table(category, cut(mean_rate, breaks=c(seq(from=0.03, to=0.3, by=0.02), 1))))
              
category       (0.03,0.05] (0.05,0.07] (0.07,0.09] (0.09,0.11] (0.11,0.13]
  Historical            51         187         129          21           5
  PresentElder         135         548         225          42          14
  L1                    17         202         133          20           2
  L2                    21         129         119          19           9
              
category       (0.13,0.15] (0.15,0.17] (0.17,0.19] (0.19,0.21] (0.21,0.23]
  Historical             1           0           0           0           0
  PresentElder           5           2           2           0           0
  L1                     1           1           0           0           0
  L2                     6           0           0           0           0
              
category       (0.23,0.25] (0.25,0.27] (0.27,0.29] (0.29,1]
  Historical             0           0           0        0
  PresentElder           0           0           0        0
  L1                     0           0           0        0
  L2                     0           0           0        0

As shown here, inverse-transforming helps.

Click here to view code.
with(ia, table(category, cut(1/mean_rate, breaks=seq(from=1, to=35, by=1))))
              
category       (1,2] (2,3] (3,4] (4,5] (5,6] (6,7] (7,8] (8,9] (9,10] (10,11]
  Historical       0     0     0     0     0     1     0     5     12       9
  PresentElder     0     0     0     0     2     3     8    10     17      22
  L1               0     0     0     0     0     1     1     1      2      17
  L2               0     0     0     0     0     2     9     4      2      16
              
category       (11,12] (12,13] (13,14] (14,15] (15,16] (16,17] (17,18] (18,19]
  Historical        32      39      43      50      50      34      30      19
  PresentElder      52      67      84      98     100     110     116      68
  L1                25      41      56      41      50      53      27      31
  L2                27      33      47      36      35      30      20      12
              
category       (19,20] (20,21] (21,22] (22,23] (23,24] (24,25] (25,26] (26,27]
  Historical        20      20      10       8       7       3       1       1
  PresentElder      83      53      26      12      21       9       8       3
  L1                13       5       7       1       2       0       1       1
  L2                 9       6       9       2       1       3       0       0
              
category       (27,28] (28,29] (29,30] (30,31] (31,32] (32,33] (33,34] (34,35]
  Historical         0       0       0       0       0       0       0       0
  PresentElder       0       0       1       0       0       0       0       0
  L1                 0       0       0       0       0       0       0       0
  L2                 0       0       0       0       0       0       0       0
  1. Define model
Click here to view code.
 hyp.mod.ia = lmer(PC1 ~ category * (participant_gender + moraPositionFactor + complex +  c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1  | word.alt.format), data=ia, REML=F)
  1. Check VIFs
Click here to view code.
display_vif(hyp.mod.ia) 
Parameter GVIF df Transformed GVIF
category 28.580 3 3.057
participant_gender 1.158 1 1.158
moraPositionFactor 3.507 2 1.873
complex 3.263 1 3.263
mean_rate_transf (centered) 1.372 1 1.372
final_pause 1.010 1 1.010
prev_c_tongue 1.107 2 1.052
category &times; participant_gender 1.218 3 1.068
category &times; moraPositionFactor 51.929 6 1.932
category &times; complex 92.995 3 4.531
category &times; mean_rate_transf (centered) 1.456 3 1.134
  1. Table of model results
Click here to view code.
lmer_table_ia = format_lmer_table(hyp.mod.ia)
knitr::kable(lmer_table_ia, caption="Model of ia uPC1")
Estimate SE df t p
(Intercept) -0.911 0.198 51 -4.603 <0.001
category|PresentElder.v.Historical 0.478 0.266 342 1.799 0.073
category|L1L2.v.HistoricalPresentElder -0.817 0.240 448 -3.408 <0.001
category|L2.v.L1 0.069 0.395 503 0.175 0.861
participant_gender|F.v.M -0.193 0.068 55 -2.828 0.007
moraPositionFactor2 0.582 0.301 75 1.935 0.057
moraPositionFactor3 0.377 0.156 27 2.422 0.023
complex|y.v.n 0.103 0.117 109 0.881 0.380
c.(mean_rate_transf) 0.019 0.010 2002 1.938 0.053
final_pause|y.v.n -0.553 0.059 1979 -9.394 <0.001
prev_c_tongue|coronal.v.neutral -0.131 0.125 105 -1.046 0.298
prev_c_tongue|dorsal.v.neutral 0.051 0.133 91 0.382 0.704
category|PresentElder.v.Historical:participant_gender|F.v.M -0.137 0.168 58 -0.817 0.418
category|L1L2.v.HistoricalPresentElder:participant_gender|F.v.M -0.125 0.136 55 -0.915 0.364
category|L2.v.L1:participant_gender|F.v.M -0.412 0.215 53 -1.918 0.061
category|PresentElder.v.Historical:moraPositionFactor2 0.742 0.472 1478 1.570 0.117
category|L1L2.v.HistoricalPresentElder:moraPositionFactor2 0.352 0.466 1240 0.755 0.450
category|L2.v.L1:moraPositionFactor2 -0.099 0.768 1973 -0.129 0.897
category|PresentElder.v.Historical:moraPositionFactor3 0.102 0.156 1897 0.654 0.513
category|L1L2.v.HistoricalPresentElder:moraPositionFactor3 0.309 0.137 1645 2.258 0.024
category|L2.v.L1:moraPositionFactor3 0.237 0.216 1917 1.097 0.273
category|PresentElder.v.Historical:complex|y.v.n -0.164 0.198 1342 -0.829 0.407
category|L1L2.v.HistoricalPresentElder:complex|y.v.n 0.217 0.192 1627 1.132 0.258
category|L2.v.L1:complex|y.v.n 0.036 0.324 1974 0.110 0.913
category|PresentElder.v.Historical:c.(mean_rate_transf) 0.003 0.023 1912 0.133 0.895
category|L1L2.v.HistoricalPresentElder:c.(mean_rate_transf) -0.017 0.019 2001 -0.878 0.380
category|L2.v.L1:c.(mean_rate_transf) 0.019 0.032 2012 0.607 0.544
Model of ia uPC1
  1. Get speaker intercepts, save as .csv
Click here to view code.
speaker_intercepts_ia <- ranef(hyp.mod.ia)$Speaker

speaker_intercepts_ia_df <- data.frame(Speaker = rownames(speaker_intercepts_ia), Intercept = speaker_intercepts_ia[, 1])

speaker_intercepts_ia_df <- speaker_intercepts_ia_df %>% 
  mutate(sequence = "ia" )

write.csv(speaker_intercepts_ia_df, here("Data", "speaker_intercepts_ia.csv"))
  1. Investigate significant effects
  1. Is there evidence of an overall category effect?
Click here to view code.
hyp.mod.ia.min.cat <- update(hyp.mod.ia, ~ . - category - category:participant_gender - category:moraPositionFactor - category:complex  - category:c.(mean_rate_transf))
anova(hyp.mod.ia, hyp.mod.ia.min.cat)
Data: ia
Models:
hyp.mod.ia.min.cat: PC1 ~ participant_gender + moraPositionFactor + complex + c.(mean_rate_transf) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
hyp.mod.ia: PC1 ~ category * (participant_gender + moraPositionFactor + complex + c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
                   npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)    
hyp.mod.ia.min.cat   12 6479.7 6547.2 -3227.9   6455.7                         
hyp.mod.ia           30 6449.4 6618.0 -3194.7   6389.4 66.283 18  1.902e-07 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Yes, there is.

  1. Investigating category differences further with an EMM test
Click here to view code.
emmeans(hyp.mod.ia, pairwise ~ category)
$emmeans
 category      emmean    SE  df lower.CL upper.CL
 Historical   -0.6726 0.182 193   -1.031   -0.315
 PresentElder  0.0868 0.151 184   -0.211    0.385
 L1           -0.9469 0.212 218   -1.365   -0.528
 L2           -0.8318 0.224 206   -1.274   -0.389

Results are averaged over the levels of: participant_gender, moraPositionFactor, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast                  estimate    SE  df t.ratio p.value
 Historical - PresentElder   -0.759 0.200 118  -3.800  0.0013
 Historical - L1              0.274 0.256 162   1.071  0.7080
 Historical - L2              0.159 0.264 155   0.604  0.9307
 PresentElder - L1            1.034 0.233 152   4.439  0.0001
 PresentElder - L2            0.919 0.241 145   3.810  0.0012
 L1 - L2                     -0.115 0.283 163  -0.407  0.9771

Results are averaged over the levels of: participant_gender, moraPositionFactor, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
P value adjustment: tukey method for comparing a family of 4 estimates 

Significant differences between Present Elders + L1, as well and Present Elders + L2 c) Is there evidence of an overall gender effect?

Click here to view code.
hyp.mod.ia.min.gen <- update(hyp.mod.ia, ~ . - participant_gender - category:participant_gender) 
anova(hyp.mod.ia, hyp.mod.ia.min.gen)
Data: ia
Models:
hyp.mod.ia.min.gen: PC1 ~ category + moraPositionFactor + complex + c.(mean_rate_transf) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format) + category:moraPositionFactor + category:complex + category:c.(mean_rate_transf)
hyp.mod.ia: PC1 ~ category * (participant_gender + moraPositionFactor + complex + c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
                   npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)  
hyp.mod.ia.min.gen   26 6452.7 6598.8 -3200.3   6400.7                       
hyp.mod.ia           30 6449.4 6618.0 -3194.7   6389.4 11.255  4    0.02385 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Yes, there is.

  1. Investigating gender differences further with an EMM test
Click here to view code.
emmeans(hyp.mod.ia, pairwise ~ participant_gender)
$emmeans
 participant_gender emmean    SE  df lower.CL upper.CL
 M                  -0.398 0.143 191   -0.679   -0.117
 F                  -0.784 0.143 185   -1.065   -0.503

Results are averaged over the levels of: category, moraPositionFactor, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast estimate    SE   df t.ratio p.value
 M - F       0.386 0.148 71.4   2.610  0.0110

Results are averaged over the levels of: category, moraPositionFactor, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 

Signficant pairwise comparision for gender.

  1. Is there an overall effect of mora position?|
Click here to view code.
hyp.mod.ia.min.moraPos <- update(hyp.mod.ia, ~ . - moraPositionFactor - category:moraPositionFactor)
anova(hyp.mod.ia, hyp.mod.ia.min.moraPos) #
Data: ia
Models:
hyp.mod.ia.min.moraPos: PC1 ~ category + participant_gender + complex + c.(mean_rate_transf) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format) + category:participant_gender + category:complex + category:c.(mean_rate_transf)
hyp.mod.ia: PC1 ~ category * (participant_gender + moraPositionFactor + complex + c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
                       npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
hyp.mod.ia.min.moraPos   22 6447.8 6571.4 -3201.9   6403.8                     
hyp.mod.ia               30 6449.4 6618.0 -3194.7   6389.4 14.374  8    0.07253
                        
hyp.mod.ia.min.moraPos  
hyp.mod.ia             .
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

No significant effect of mora position by itself. Indicates that effect lies in interactions.

  1. Investigating further by conducting an EMM test on the interaction with category.
Click here to view code.
emmeans(hyp.mod.ia, pairwise ~ moraPositionFactor| category)
$emmeans
category = Historical:
 moraPositionFactor   emmean    SE  df lower.CL upper.CL
 1                  -0.74139 0.286 236   -1.305  -0.1779
 2                  -0.70615 0.330 507   -1.354  -0.0579
 3+                 -0.57035 0.229 385   -1.021  -0.1194

category = PresentElder:
 moraPositionFactor   emmean    SE  df lower.CL upper.CL
 1                  -0.26327 0.239 134   -0.736   0.2099
 2                   0.51360 0.243 351    0.036   0.9912
 3+                  0.00997 0.183 286   -0.350   0.3698

category = L1:
 moraPositionFactor   emmean    SE  df lower.CL upper.CL
 1                  -1.35362 0.321 420   -1.984  -0.7233
 2                  -0.54609 0.398 939   -1.327   0.2351
 3+                 -0.94108 0.289 636   -1.509  -0.3737

category = L2:
 moraPositionFactor   emmean    SE  df lower.CL upper.CL
 1                  -1.28450 0.350 396   -1.972  -0.5965
 2                  -0.57627 0.453 949   -1.465   0.3120
 3+                 -0.63469 0.303 546   -1.230  -0.0396

Results are averaged over the levels of: participant_gender, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
category = Historical:
 contrast estimate    SE     df t.ratio p.value
 1 - 2     -0.0352 0.464  349.4  -0.076  0.9968
 1 - (3+)  -0.1710 0.208  121.4  -0.822  0.6900
 2 - (3+)  -0.1358 0.417  468.6  -0.325  0.9433

category = PresentElder:
 contrast estimate    SE     df t.ratio p.value
 1 - 2     -0.7769 0.345  169.7  -2.250  0.0659
 1 - (3+)  -0.2732 0.177   62.3  -1.544  0.2778
 2 - (3+)   0.5036 0.305  256.7   1.652  0.2260

category = L1:
 contrast estimate    SE     df t.ratio p.value
 1 - 2     -0.8075 0.553  895.7  -1.461  0.3102
 1 - (3+)  -0.4125 0.211  137.1  -1.957  0.1270
 2 - (3+)   0.3950 0.528 1160.8   0.748  0.7349

category = L2:
 contrast estimate    SE     df t.ratio p.value
 1 - 2     -0.7082 0.635  786.3  -1.116  0.5047
 1 - (3+)  -0.6498 0.227  175.3  -2.859  0.0132
 2 - (3+)   0.0584 0.591  973.0   0.099  0.9946

Results are averaged over the levels of: participant_gender, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
P value adjustment: tukey method for comparing a family of 3 estimates 

No significant difference between mora positions within any of the categories, except for 1 - (3+) for the Young L2 speakers.

10.4 /ea/ regression model

  1. Read in data, create phonological form trackers
Click here to view code.
ea = read.csv(here("Data", "ea_PC_results_local_rate.csv"), header=TRUE, encoding="UTF-8", row.names=1) %>%
  # merge pause data
  left_join(
    read.csv(here("Data", "pause_info.csv"), header=TRUE, encoding="UTF-8", row.names=1),
    by = "MatchId"
  ) %>%
  mutate(
    phon.word = word %>% 
      str_replace("([AEIOU])\\1", "\\1") %>%
      str_replace(fixed("wh"), "f") %>%
      str_replace(fixed("ng"), "N"),
    prev_c = str_extract(phon.word, ".(?=ea)"),
    prev_c_tongue = case_when(
      prev_c %in% c("p", "m", "f", "h") ~ "neutral",
      prev_c %in% c("t", "n", "r") ~ "coronal",
      prev_c %in% c("k", "N", "w") ~ "dorsal"
    )
  )
  1. Set up factors as required
Click here to view code.
ea = ea %>%
  mutate(
    category = factor(category, levels=c("Historical", "PresentElder", "L1", "L2")),
    stress = factor(stress == "yes"),
    participant_gender = factor(participant_gender, levels=c("M", "F")),
    complex = factor(complex == "yes"),
    final = factor(final == "TRUE"),
    prev_c_tongue = factor(prev_c_tongue, levels=c("neutral", "coronal", "dorsal")),
    moraPositionFactor = ifelse(moraPosition > 2, "3+", moraPosition),
    moraPositionFactor = factor(moraPositionFactor, levels=c("1", "2", "3+")))
  1. Set up contrasts for factors
Click here to view code.
contrasts(ea$category) = matrix(c(c(-1,1,0,0)/2, c(-1,-1,1,1)/2, c(0,0,-1,1)/2), ncol=3)
colnames(contrasts(ea$category)) = c("|PresentElder.v.Historical", "|L1L2.v.HistoricalPresentElder", "|L2.v.L1")

contrasts(ea$stress) = contr.helmert(2)
colnames(contrasts(ea$stress)) = c("|y.v.n")
contrasts(ea$participant_gender) = contr.helmert(2)
colnames(contrasts(ea$participant_gender)) = c("|F.v.M")
contrasts(ea$complex) = contr.helmert(2)
colnames(contrasts(ea$complex)) = c("|y.v.n")
contrasts(ea$final) = contr.helmert(2)
colnames(contrasts(ea$final)) = c("|y.v.n")
contrasts(ea$prev_c_tongue) = contr.treatment(3) - 1/3
colnames(contrasts(ea$prev_c_tongue)) = c("|coronal.v.neutral", "|dorsal.v.neutral")
contrasts(ea$moraPositionFactor) <- contr.treatment(3)
  1. Bin pause data
Click here to view code.
ea = ea %>%
  mutate(
    pause_bin = factor(pause_length > 0.25, levels=c(FALSE, TRUE)))
  1. Set up final_pause annotations and define contrasts
Click here to view code.
ea <- ea %>% 
  mutate(final_pause  = case_when(
    final == TRUE & pause_bin == TRUE ~ TRUE,
    final == TRUE & pause_bin == FALSE ~ FALSE,
    final == FALSE & pause_bin == TRUE ~ FALSE,
    final == FALSE & pause_bin == FALSE ~ FALSE,
  ))


contrasts(ea$final_pause) = contr.helmert(2)
colnames(contrasts(ea$final_pause)) = c("|y.v.n")
  1. Inverse transform mean_rate, then remove potential leverage points <= 5 > 31. Reasoning for this descision is shwon for /ia/ above.
Click here to view code.
ea <-  ea %>% 
  mutate(mean_rate_transf = 1/mean_rate) %>%
  filter(mean_rate_transf > 5, mean_rate_transf <  31)
  1. Define model
Click here to view code.
hyp.mod.ea <-  lmer(PC1 ~ category * (participant_gender +   complex   +c.(mean_rate_transf) ) + final_pause +    prev_c_tongue + (1   | Speaker) + (1  | word.alt.format), data=ea, REML=F)
  1. Check VIFs
Click here to view code.
display_vif(hyp.mod.ea) 
Parameter GVIF df Transformed GVIF
category 2.584 3 1.372
participant_gender 1.122 1 1.122
complex 1.808 1 1.808
mean_rate_transf (centered) 1.452 1 1.452
final_pause 1.007 1 1.007
prev_c_tongue 1.694 2 1.302
category &times; participant_gender 1.157 3 1.050
category &times; complex 2.926 3 1.430
category &times; mean_rate_transf (centered) 1.580 3 1.165
  1. Table of model results
Click here to view code.
lmer_table_ea = format_lmer_table(hyp.mod.ea)
knitr::kable(lmer_table_ea, caption="Model of ea uPC1")
Estimate SE df t p
(Intercept) -0.991 0.106 112 -9.334 <0.001
category|PresentElder.v.Historical 0.423 0.220 152 1.926 0.056
category|L1L2.v.HistoricalPresentElder -0.068 0.163 107 -0.415 0.679
category|L2.v.L1 0.433 0.241 83 1.796 0.076
participant_gender|F.v.M -0.074 0.070 59 -1.051 0.298
complex|y.v.n -0.239 0.078 52 -3.084 0.003
c.(mean_rate_transf) 0.034 0.009 2704 3.953 <0.001
final_pause|y.v.n -0.665 0.046 2737 -14.533 <0.001
prev_c_tongue|coronal.v.neutral -0.155 0.129 58 -1.201 0.234
prev_c_tongue|dorsal.v.neutral -0.052 0.198 65 -0.262 0.794
category|PresentElder.v.Historical:participant_gender|F.v.M -0.258 0.181 72 -1.427 0.158
category|L1L2.v.HistoricalPresentElder:participant_gender|F.v.M -0.099 0.140 59 -0.707 0.482
category|L2.v.L1:participant_gender|F.v.M -0.142 0.214 52 -0.663 0.511
category|PresentElder.v.Historical:complex|y.v.n -0.362 0.155 2721 -2.335 0.020
category|L1L2.v.HistoricalPresentElder:complex|y.v.n -0.233 0.102 2752 -2.295 0.022
category|L2.v.L1:complex|y.v.n -0.208 0.131 2720 -1.593 0.111
category|PresentElder.v.Historical:c.(mean_rate_transf) -0.012 0.025 2555 -0.474 0.636
category|L1L2.v.HistoricalPresentElder:c.(mean_rate_transf) 0.037 0.017 2700 2.135 0.033
category|L2.v.L1:c.(mean_rate_transf) 0.001 0.024 2757 0.023 0.982
Model of ea uPC1
  1. Get speaker intercepts, save as .csv
Click here to view code.
speaker_intercepts_ea <- ranef(hyp.mod.ea)$Speaker

speaker_intercepts_ea_df <- data.frame(Speaker = rownames(speaker_intercepts_ea), Intercept = speaker_intercepts_ea[, 1])

speaker_intercepts_ea_df <- speaker_intercepts_ea_df %>% 
  mutate(sequence = "ea" )

write.csv(speaker_intercepts_ea_df, here("Data", "speaker_intercepts_ea.csv"))
  1. Investigate significant effects
  1. Is there evidence of an overall category effect?
Click here to view code.
hyp.mod.ea.min.cat <- update(hyp.mod.ea, ~ . - category - category:participant_gender - category:stress - category:complex - category:c.(mean_rate_transf))
anova(hyp.mod.ea, hyp.mod.ea.min.cat)
Data: ea
Models:
hyp.mod.ea.min.cat: PC1 ~ participant_gender + complex + c.(mean_rate_transf) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
hyp.mod.ea: PC1 ~ category * (participant_gender + complex + c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
                   npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)    
hyp.mod.ea.min.cat   10 8933.0 8992.3 -4456.5   8913.0                         
hyp.mod.ea           22 8916.5 9046.8 -4436.3   8872.5 40.525 12  5.882e-05 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Yes there is.

  1. Investigating category differences further with an EMM test
Click here to view code.
emmeans(hyp.mod.ea, pairwise ~ category)
$emmeans
 category     emmean    SE  df lower.CL upper.CL
 Historical   -1.169 0.208 250    -1.58   -0.760
 PresentElder -0.746 0.149 131    -1.04   -0.452
 L1           -1.241 0.189 112    -1.62   -0.867
 L2           -0.809 0.205 133    -1.21   -0.403

Results are averaged over the levels of: participant_gender, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast                  estimate    SE    df t.ratio p.value
 Historical - PresentElder  -0.4230 0.230 166.2  -1.836  0.2603
 Historical - L1             0.0726 0.259 137.4   0.281  0.9923
 Historical - L2            -0.3604 0.271 149.9  -1.330  0.5455
 PresentElder - L1           0.4956 0.213  89.6   2.324  0.1002
 PresentElder - L2           0.0627 0.228 105.1   0.275  0.9927
 L1 - L2                    -0.4329 0.257  97.0  -1.687  0.3361

Results are averaged over the levels of: participant_gender, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
P value adjustment: tukey method for comparing a family of 4 estimates 

No significant differences. Indicates category effect lies in interactions

  1. Is category significant at any level of complex?
Click here to view code.
emmeans(hyp.mod.ea, pairwise ~  category| complex)
$emmeans
complex = FALSE:
 category     emmean    SE  df lower.CL upper.CL
 Historical   -1.227 0.182 147   -1.587   -0.867
 PresentElder -0.442 0.152 148   -0.742   -0.141
 L1           -0.989 0.189 110   -1.365   -0.614
 L2           -0.349 0.195 105   -0.735    0.038

complex = TRUE:
 category     emmean    SE  df lower.CL upper.CL
 Historical   -1.111 0.317 622   -1.733   -0.488
 PresentElder -1.050 0.202 129   -1.450   -0.650
 L1           -1.493 0.244 181   -1.975   -1.012
 L2           -1.269 0.279 286   -1.817   -0.720

Results are averaged over the levels of: participant_gender, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
complex = FALSE:
 contrast                  estimate    SE    df t.ratio p.value
 Historical - PresentElder  -0.7853 0.196  82.7  -4.016  0.0007
 Historical - L1            -0.2376 0.226  76.2  -1.053  0.7188
 Historical - L2            -0.8785 0.231  76.0  -3.797  0.0016
 PresentElder - L1           0.5477 0.196  61.4   2.789  0.0346
 PresentElder - L2          -0.0932 0.203  62.1  -0.459  0.9676
 L1 - L2                    -0.6409 0.232  61.5  -2.762  0.0370

complex = TRUE:
 contrast                  estimate    SE    df t.ratio p.value
 Historical - PresentElder  -0.0608 0.342 678.8  -0.178  0.9980
 Historical - L1             0.3827 0.369 522.0   1.037  0.7278
 Historical - L2             0.1578 0.393 595.7   0.402  0.9781
 PresentElder - L1           0.4435 0.273 258.8   1.624  0.3670
 PresentElder - L2           0.2186 0.305 351.4   0.717  0.8902
 L1 - L2                    -0.2249 0.335 299.6  -0.672  0.9078

Results are averaged over the levels of: participant_gender, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
P value adjustment: tukey method for comparing a family of 4 estimates 
  1. Is there a significant overall effect of complex?
Click here to view code.
hyp.mod.ea.min.complex <- update(hyp.mod.ea, ~ . - complex - category:complex)

anova(hyp.mod.ea, hyp.mod.ea.min.complex)  
Data: ea
Models:
hyp.mod.ea.min.complex: PC1 ~ category + participant_gender + c.(mean_rate_transf) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format) + category:participant_gender + category:c.(mean_rate_transf)
hyp.mod.ea: PC1 ~ category * (participant_gender + complex + c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
                       npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
hyp.mod.ea.min.complex   18 8923.8 9030.4 -4443.9   8887.8                     
hyp.mod.ea               22 8916.5 9046.8 -4436.3   8872.5 15.246  4   0.004218
                         
hyp.mod.ea.min.complex   
hyp.mod.ea             **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Yes there is.

  1. Investigating further with an EMM test
Click here to view code.
emmeans(hyp.mod.ea, pairwise ~ complex)
$emmeans
 complex emmean    SE    df lower.CL upper.CL
 FALSE   -0.752 0.124 160.5   -0.996   -0.508
 TRUE    -1.231 0.163  66.4   -1.557   -0.904

Results are averaged over the levels of: category, participant_gender, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast     estimate    SE   df t.ratio p.value
 FALSE - TRUE    0.479 0.174 53.6   2.758  0.0079

Results are averaged over the levels of: category, participant_gender, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 

Significant pairwise comparison

10.5 /oa/ regression model

  1. Read in data, create phonological form trackers
Click here to view code.
oa = read.csv(here("Data", "oa_PC_results_local_rate.csv"), header=TRUE, encoding="UTF-8", row.names=1) %>%
  # merge pause data
  left_join(
    read.csv(here("Data", "pause_info.csv"), header=TRUE, encoding="UTF-8", row.names=1),
    by = "MatchId"
  ) %>%
  mutate(
    phon.word = word %>% 
      str_replace("([AEIOU])\\1", "\\1") %>%
      str_replace(fixed("wh"), "f") %>%
      str_replace(fixed("ng"), "N"),
    prev_c = str_extract(phon.word, ".(?=oa)"),
    prev_c_tongue = case_when(
      prev_c %in% c("p", "m", "f", "h") ~ "neutral",
      prev_c %in% c("t", "n", "r") ~ "coronal",
      prev_c %in% c("k", "N", "w") ~ "dorsal"
    )
  )
  1. Set up factors as required
Click here to view code.
oa = oa %>%
  mutate(
    category = factor(category, levels=c("Historical", "PresentElder", "L1", "L2")),
    stress = factor(stress == "yes"),
    participant_gender = factor(participant_gender, levels=c("M", "F")),
    complex = factor(complex == "yes"),
    final = factor(final == "TRUE"),
    prev_c_tongue = factor(prev_c_tongue, levels=c("neutral", "coronal", "dorsal")),
    moraPositionFactor = ifelse(moraPosition > 2, "3+", moraPosition),
    moraPositionFactor = factor(moraPositionFactor, levels=c("1", "2", "3+")))
  1. Set up contrasts for factors
Click here to view code.
contrasts(oa$category) = matrix(c(c(-1,1,0,0)/2, c(-1,-1,1,1)/2, c(0,0,-1,1)/2), ncol=3)
colnames(contrasts(oa$category)) = c("|PresentElder.v.Historical", "|L1L2.v.HistoricalPresentElder", "|L2.v.L1")
contrasts(oa$stress) = contr.helmert(2)
colnames(contrasts(oa$stress)) = c("|y.v.n")
contrasts(oa$participant_gender) = contr.helmert(2)
colnames(contrasts(oa$participant_gender)) = c("|F.v.M")
contrasts(oa$complex) = contr.helmert(2)
colnames(contrasts(oa$complex)) = c("|y.v.n")
contrasts(oa$final) = contr.helmert(2)
colnames(contrasts(oa$final)) = c("|y.v.n")
contrasts(oa$prev_c_tongue) = contr.treatment(3) - 1/3
colnames(contrasts(oa$prev_c_tongue)) = c("|coronal.v.neutral", "|dorsal.v.neutral")
contrasts(oa$moraPositionFactor) <- contr.treatment(3)
  1. Bin pause data
Click here to view code.
  oa = oa %>%
  mutate(
    pause_bin = factor(pause_length > 0.25, levels=c(FALSE, TRUE)) )  
  1. Set up final_pause annotations and define contrasts
Click here to view code.
oa <- oa %>% 
  mutate(final_pause  = case_when(
    final == TRUE & pause_bin == TRUE ~ TRUE,
    final == TRUE & pause_bin == FALSE ~ FALSE,
    final == FALSE & pause_bin == TRUE ~ FALSE,
    final == FALSE & pause_bin == FALSE ~ FALSE,
  ))

contrasts(oa$final_pause) = contr.helmert(2)
colnames(contrasts(oa$final_pause)) = c("|y.v.n")
  1. Inverse transform mean_rate, then remove potential leverage points <= 5 > 31. See /ia/ section for reasoning.
Click here to view code.
oa <-  oa %>% 
  mutate(mean_rate_transf = 1/mean_rate)  %>%
  filter(mean_rate_transf > 5, mean_rate_transf <  31)
  1. Define model
Click here to view code.
hyp.mod.oa =  lmer(PC1 ~ category * (participant_gender + moraPositionFactor  + complex  +  c.(mean_rate_transf)) +  final_pause +  prev_c_tongue + (1 | Speaker) + (1  | word.alt.format), data=oa, REML=F)
  1. Check VIFs
Click here to view code.
display_vif(hyp.mod.oa)  
Parameter GVIF df Transformed GVIF
category 55.417 3 3.813
participant_gender 1.148 1 1.148
moraPositionFactor 2.003 2 1.415
complex 1.624 1 1.624
mean_rate_transf (centered) 1.346 1 1.346
final_pause 1.030 1 1.030
prev_c_tongue 1.420 2 1.192
category &times; participant_gender 1.255 3 1.079
category &times; moraPositionFactor 4.352 6 1.278
category &times; complex 31.169 3 3.147
category &times; mean_rate_transf (centered) 1.519 3 1.150
  1. Table of model results
Click here to view code.
lmer_table_oa = format_lmer_table(hyp.mod.oa)
knitr::kable(lmer_table_oa, caption="Model of oa uPC1")
Estimate SE df t p
(Intercept) -0.626 0.195 48 -3.210 0.002
category|PresentElder.v.Historical -0.035 0.269 535 -0.130 0.897
category|L1L2.v.HistoricalPresentElder -0.276 0.234 556 -1.179 0.239
category|L2.v.L1 0.258 0.363 626 0.710 0.478
participant_gender|F.v.M -0.097 0.059 59 -1.639 0.107
moraPositionFactor2 0.303 0.241 17 1.257 0.225
moraPositionFactor3 0.175 0.200 34 0.875 0.388
complex|y.v.n -0.173 0.126 44 -1.375 0.176
c.(mean_rate_transf) 0.036 0.011 1618 3.218 0.001
final_pause|y.v.n -0.232 0.058 1671 -3.994 <0.001
prev_c_tongue|coronal.v.neutral 0.577 0.174 21 3.316 0.003
prev_c_tongue|dorsal.v.neutral 0.226 0.233 25 0.970 0.341
category|PresentElder.v.Historical:participant_gender|F.v.M -0.261 0.153 70 -1.699 0.094
category|L1L2.v.HistoricalPresentElder:participant_gender|F.v.M -0.447 0.118 60 -3.779 <0.001
category|L2.v.L1:participant_gender|F.v.M -0.060 0.180 52 -0.336 0.738
category|PresentElder.v.Historical:moraPositionFactor2 0.417 0.197 1689 2.121 0.034
category|L1L2.v.HistoricalPresentElder:moraPositionFactor2 0.280 0.158 1684 1.772 0.077
category|L2.v.L1:moraPositionFactor2 -0.205 0.242 1660 -0.846 0.398
category|PresentElder.v.Historical:moraPositionFactor3 0.356 0.273 1628 1.301 0.193
category|L1L2.v.HistoricalPresentElder:moraPositionFactor3 0.685 0.192 1576 3.561 <0.001
category|L2.v.L1:moraPositionFactor3 0.271 0.259 1687 1.044 0.297
category|PresentElder.v.Historical:complex|y.v.n -0.185 0.206 1603 -0.896 0.370
category|L1L2.v.HistoricalPresentElder:complex|y.v.n -0.044 0.187 857 -0.235 0.814
category|L2.v.L1:complex|y.v.n -0.177 0.292 1616 -0.606 0.545
category|PresentElder.v.Historical:c.(mean_rate_transf) -0.013 0.027 1520 -0.479 0.632
category|L1L2.v.HistoricalPresentElder:c.(mean_rate_transf) -0.007 0.022 1611 -0.298 0.766
category|L2.v.L1:c.(mean_rate_transf) -0.029 0.035 1643 -0.835 0.404
Model of oa uPC1
  1. Get speaker intercepts, save as .csv
Click here to view code.
speaker_intercepts_oa <- ranef(hyp.mod.oa)$Speaker

speaker_intercepts_oa_df <- data.frame(Speaker = rownames(speaker_intercepts_oa), Intercept = speaker_intercepts_oa[, 1])

speaker_intercepts_oa_df <- speaker_intercepts_oa_df %>% 
  mutate(sequence = "oa" )

write.csv(speaker_intercepts_oa_df, here("Data", "speaker_intercepts_oa.csv"))
  1. Investigate significant effects
  1. Is there evidence of an overall category effect?
Click here to view code.
hyp.mod.oa.min.cat <- update(hyp.mod.oa, ~ . - category - category:participant_gender - category:moraPositionFactor - category:complex - category:c.(mean_rate_transf))
anova(hyp.mod.oa, hyp.mod.oa.min.cat) 
Data: oa
Models:
hyp.mod.oa.min.cat: PC1 ~ participant_gender + moraPositionFactor + complex + c.(mean_rate_transf) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
hyp.mod.oa: PC1 ~ category * (participant_gender + moraPositionFactor + complex + c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
                   npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)    
hyp.mod.oa.min.cat   12 5607.3 5672.5 -2791.7   5583.3                         
hyp.mod.oa           30 5600.6 5763.7 -2770.3   5540.6 42.711 18  0.0008789 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Yep, there is.

  1. Investigating category differences with an EMM test
Click here to view code.
emmeans(hyp.mod.oa, pairwise ~ category)
$emmeans
 category     emmean    SE  df lower.CL upper.CL
 Historical   -0.601 0.226 349   -1.046  -0.1560
 PresentElder -0.378 0.176 235   -0.726  -0.0306
 L1           -0.583 0.255 454   -1.084  -0.0821
 L2           -0.303 0.274 509   -0.842   0.2347

Results are averaged over the levels of: participant_gender, moraPositionFactor, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
 contrast                  estimate    SE  df t.ratio p.value
 Historical - PresentElder  -0.2227 0.245 401  -0.909  0.8000
 Historical - L1            -0.0179 0.315 500  -0.057  0.9999
 Historical - L2            -0.2975 0.325 525  -0.915  0.7970
 PresentElder - L1           0.2048 0.279 458   0.733  0.8836
 PresentElder - L2          -0.0748 0.293 495  -0.255  0.9942
 L1 - L2                    -0.2796 0.339 557  -0.825  0.8429

Results are averaged over the levels of: participant_gender, moraPositionFactor, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
P value adjustment: tukey method for comparing a family of 4 estimates 

No significant differences, suggests category effect lies in the interactions

  1. Investigating further by conducting an EMM test on the interaction of category and gender
Click here to view code.
emmeans(hyp.mod.oa, pairwise ~  participant_gender |category) 
$emmeans
category = Historical:
 participant_gender  emmean    SE  df lower.CL upper.CL
 M                  -0.8581 0.251 296   -1.351 -0.36476
 F                  -0.3437 0.275 257   -0.885  0.19784

category = PresentElder:
 participant_gender  emmean    SE  df lower.CL upper.CL
 M                  -0.3747 0.205 195   -0.779  0.02996
 F                  -0.3817 0.196 212   -0.769  0.00557

category = L1:
 participant_gender  emmean    SE  df lower.CL upper.CL
 M                  -0.2926 0.289 267   -0.862  0.27678
 F                  -0.8734 0.285 328   -1.435 -0.31235

category = L2:
 participant_gender  emmean    SE  df lower.CL upper.CL
 M                   0.0473 0.307 298   -0.557  0.65189
 F                  -0.6542 0.311 335   -1.266 -0.04263

Results are averaged over the levels of: moraPositionFactor, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
category = Historical:
 contrast estimate    SE   df t.ratio p.value
 M - F    -0.51438 0.269 97.6  -1.914  0.0586

category = PresentElder:
 contrast estimate    SE   df t.ratio p.value
 M - F     0.00696 0.192 64.2   0.036  0.9712

category = L1:
 contrast estimate    SE   df t.ratio p.value
 M - F     0.58081 0.265 61.7   2.194  0.0320

category = L2:
 contrast estimate    SE   df t.ratio p.value
 M - F     0.70149 0.286 67.1   2.451  0.0169

Results are averaged over the levels of: moraPositionFactor, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 

Significant differences in the L1 + L2 categories.

  1. Is there an overall effect of gender?
Click here to view code.
hyp.mod.oa.min.gender<- update(hyp.mod.oa, ~ . - participant_gender - category:participant_gender)
anova(hyp.mod.oa, hyp.mod.oa.min.gender) 
Data: oa
Models:
hyp.mod.oa.min.gender: PC1 ~ category + moraPositionFactor + complex + c.(mean_rate_transf) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format) + category:moraPositionFactor + category:complex + category:c.(mean_rate_transf)
hyp.mod.oa: PC1 ~ category * (participant_gender + moraPositionFactor + complex + c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
                      npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
hyp.mod.oa.min.gender   26 5607.4 5748.7 -2777.7   5555.4                     
hyp.mod.oa              30 5600.6 5763.7 -2770.3   5540.6 14.774  4   0.005193
                        
hyp.mod.oa.min.gender   
hyp.mod.oa            **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

yes

  1. Is there an overall effect of mora position?
Click here to view code.
hyp.mod.oa.min.moraPos <- update(hyp.mod.oa, ~ . - moraPositionFactor - category:moraPositionFactor)
anova(hyp.mod.oa, hyp.mod.oa.min.moraPos)
Data: oa
Models:
hyp.mod.oa.min.moraPos: PC1 ~ category + participant_gender + complex + c.(mean_rate_transf) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format) + category:participant_gender + category:complex + category:c.(mean_rate_transf)
hyp.mod.oa: PC1 ~ category * (participant_gender + moraPositionFactor + complex + c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
                       npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)
hyp.mod.oa.min.moraPos   22 5605.6 5725.2 -2780.8   5561.6                     
hyp.mod.oa               30 5600.6 5763.7 -2770.3   5540.6 21.038  8   0.007047
                         
hyp.mod.oa.min.moraPos   
hyp.mod.oa             **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

yes.

  1. Investigate interaction with category further by conducting an EMM test
Click here to view code.
emmeans(hyp.mod.oa, pairwise ~ moraPositionFactor| category) 
$emmeans
category = Historical:
 moraPositionFactor  emmean    SE  df lower.CL upper.CL
 1                  -0.4704 0.299 260   -1.058   0.1176
 2                  -0.5164 0.282 218   -1.073   0.0398
 3+                 -0.8159 0.305 319   -1.416  -0.2156

category = PresentElder:
 moraPositionFactor  emmean    SE  df lower.CL upper.CL
 1                  -0.5053 0.238 122   -0.977  -0.0338
 2                  -0.1342 0.230 111   -0.589   0.3206
 3+                 -0.4951 0.242 154   -0.973  -0.0175

category = L1:
 moraPositionFactor  emmean    SE  df lower.CL upper.CL
 1                  -0.8922 0.311 309   -1.504  -0.2800
 2                  -0.3470 0.286 229   -0.911   0.2174
 3+                 -0.5099 0.333 349   -1.164   0.1442

category = L2:
 moraPositionFactor  emmean    SE  df lower.CL upper.CL
 1                  -0.6345 0.345 386   -1.313   0.0435
 2                  -0.2942 0.301 280   -0.887   0.2990
 3+                  0.0184 0.344 407   -0.657   0.6936

Results are averaged over the levels of: participant_gender, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
category = Historical:
 contrast estimate    SE    df t.ratio p.value
 1 - 2      0.0460 0.326  81.2   0.141  0.9891
 1 - (3+)   0.3455 0.317 270.4   1.091  0.5206
 2 - (3+)   0.2995 0.344 150.7   0.871  0.6597

category = PresentElder:
 contrast estimate    SE    df t.ratio p.value
 1 - 2     -0.3711 0.291  47.4  -1.274  0.4166
 1 - (3+)  -0.0102 0.236  73.7  -0.043  0.9990
 2 - (3+)   0.3608 0.288  60.7   1.253  0.4271

category = L1:
 contrast estimate    SE    df t.ratio p.value
 1 - 2     -0.5453 0.320  76.2  -1.705  0.2098
 1 - (3+)  -0.3823 0.278 141.6  -1.378  0.3554
 2 - (3+)   0.1629 0.323  96.9   0.504  0.8694

category = L2:
 contrast estimate    SE    df t.ratio p.value
 1 - 2     -0.3404 0.336  93.6  -1.013  0.5707
 1 - (3+)  -0.6529 0.294 177.4  -2.218  0.0709
 2 - (3+)  -0.3126 0.329 105.9  -0.950  0.6101

Results are averaged over the levels of: participant_gender, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: kenward-roger 
P value adjustment: tukey method for comparing a family of 3 estimates 

No significant differences between mora positions within any category.

10.6 /ua/ regression model

  1. Read in data, create phonological form trackers
Click here to view code.
ua = read.csv(here("Data", "ua_PC_results_local_rate.csv"), header=TRUE, encoding="UTF-8", row.names=1) %>%
  # merge pause data
  left_join(
    read.csv(here("Data", "pause_info.csv"), header=TRUE, encoding="UTF-8", row.names=1),
    by = "MatchId"
  ) %>%
  mutate(
    phon.word = word %>% 
      str_replace("([AEIOU])\\1", "\\1") %>%
      str_replace(fixed("wh"), "f") %>%
      str_replace(fixed("ng"), "N"),
    prev_c = str_extract(phon.word, ".(?=ua)"),
    prev_c_tongue = case_when(
      prev_c %in% c("p", "m", "f", "h") ~ "neutral",
      prev_c %in% c("t", "n", "r") ~ "coronal",
      prev_c %in% c("k", "N", "w") ~ "dorsal"
    )
  )
  1. Set up factors as required
Click here to view code.
ua = ua %>%
  mutate(
    category = factor(category, levels=c("Historical", "PresentElder", "L1", "L2")),
    stress = factor(stress == "yes"),
    participant_gender = factor(participant_gender, levels=c("M", "F")),
    complex = factor(complex == "yes"),
    final = factor(final == "TRUE"),
    prev_c_tongue = factor(prev_c_tongue, levels=c("neutral", "coronal", "dorsal")),
    moraPositionFactor = ifelse(moraPosition > 2, "3+", moraPosition),
    moraPositionFactor = factor(moraPositionFactor, levels=c("1", "2", "3+")))
  1. Set up contrasts for factors
Click here to view code.
contrasts(ua$category) = matrix(c(c(-1,1,0,0)/2, c(-1,-1,1,1)/2, c(0,0,-1,1)/2), ncol=3)
colnames(contrasts(ua$category)) = c("|PresentElder.v.Historical", "|L1L2.v.HistoricalPresentElder", "|L2.v.L1")
contrasts(ua$stress) = contr.helmert(2)
colnames(contrasts(ua$stress)) = c("|y.v.n")
contrasts(ua$participant_gender) = contr.helmert(2)
colnames(contrasts(ua$participant_gender)) = c("|F.v.M")
contrasts(ua$complex) = contr.helmert(2)
colnames(contrasts(ua$complex)) = c("|y.v.n")
contrasts(ua$final) = contr.helmert(2)
colnames(contrasts(ua$final)) = c("|y.v.n")
contrasts(ua$prev_c_tongue) = contr.treatment(3) - 1/3
colnames(contrasts(ua$prev_c_tongue)) = c("|coronal.v.neutral", "|dorsal.v.neutral")
contrasts(ea$moraPositionFactor) <- contr.treatment(3)
  1. Bin pause data
Click here to view code.
  ua = ua %>%
  mutate(
    pause_bin = factor(pause_length > 0.25, levels=c(FALSE, TRUE)) )  
  1. Set up final_pause annotations and define contrasts
Click here to view code.
  ua <- ua %>% 
  mutate(final_pause  = case_when(
    final == TRUE & pause_bin == TRUE ~ TRUE,
    final == TRUE & pause_bin == FALSE ~ FALSE,
    final == FALSE & pause_bin == TRUE ~ FALSE,
    final == FALSE & pause_bin == FALSE ~ FALSE,
  ))

contrasts(ua$final_pause) = contr.helmert(2)
colnames(contrasts(ua$final_pause)) = c("|y.v.n")
  1. Inverse transform mean_rate, then remove potential leverage points <= 5 > 31, see /ia/ section for reasoning.
Click here to view code.
ua <-  ua %>% 
  mutate(mean_rate_transf = 1/mean_rate)  %>%
  filter(mean_rate_transf > 5, mean_rate_transf <  31)
  1. Flip the polarity of the PC1 scores so that they match the others
Click here to view code.
ua$PC1 = -1*(ua$PC1)
  1. Define model
Click here to view code.
 hyp.mod.ua =  lmer(PC1 ~ category * (participant_gender+  complex +  c.(mean_rate_transf)) +   final_pause  + prev_c_tongue + (1   | Speaker) + (1 | word.alt.format), data=ua, REML=F)
  1. Check VIFs
Click here to view code.
display_vif(hyp.mod.ua)  
Parameter GVIF df Transformed GVIF
category 30.056 3 3.109
participant_gender 1.122 1 1.122
complex 1.230 1 1.230
mean_rate_transf (centered) 1.210 1 1.210
final_pause 1.006 1 1.006
prev_c_tongue 1.025 2 1.012
category &times; participant_gender 1.163 3 1.052
category &times; complex 31.480 3 3.158
category &times; mean_rate_transf (centered) 1.251 3 1.078
  1. Table of model results
Click here to view code.
lmer_table_ua = format_lmer_table(hyp.mod.ua)
knitr::kable(lmer_table_ua, caption="Model of ua uPC1")
Estimate SE df t p
(Intercept) -0.758 0.113 122 -6.708 <0.001
category|PresentElder.v.Historical 0.483 0.166 298 2.904 0.004
category|L1L2.v.HistoricalPresentElder 0.133 0.162 489 0.818 0.414
category|L2.v.L1 0.292 0.265 608 1.103 0.271
participant_gender|F.v.M -0.183 0.044 52 -4.168 <0.001
complex|y.v.n -0.189 0.085 145 -2.218 0.028
c.(mean_rate_transf) 0.052 0.007 3414 7.554 <0.001
final_pause|y.v.n -0.413 0.044 3924 -9.279 <0.001
prev_c_tongue|coronal.v.neutral 0.338 0.110 46 3.083 0.003
prev_c_tongue|dorsal.v.neutral 0.344 0.232 34 1.482 0.147
category|PresentElder.v.Historical:participant_gender|F.v.M -0.182 0.111 62 -1.640 0.106
category|L1L2.v.HistoricalPresentElder:participant_gender|F.v.M -0.203 0.088 53 -2.315 0.025
category|L2.v.L1:participant_gender|F.v.M -0.194 0.136 47 -1.425 0.161
category|PresentElder.v.Historical:complex|y.v.n 0.078 0.139 3216 0.565 0.572
category|L1L2.v.HistoricalPresentElder:complex|y.v.n 0.228 0.143 1347 1.589 0.112
category|L2.v.L1:complex|y.v.n 0.253 0.235 3096 1.078 0.281
category|PresentElder.v.Historical:c.(mean_rate_transf) -0.025 0.017 3312 -1.440 0.150
category|L1L2.v.HistoricalPresentElder:c.(mean_rate_transf) 0.002 0.014 3404 0.135 0.893
category|L2.v.L1:c.(mean_rate_transf) -0.033 0.021 3476 -1.567 0.117
Model of ua uPC1
  1. Get speaker intercepts, save as .csv
Click here to view code.
speaker_intercepts_ua <- ranef(hyp.mod.ua)$Speaker

speaker_intercepts_ua_df <- data.frame(Speaker = rownames(speaker_intercepts_ua), Intercept = speaker_intercepts_ua[, 1])

speaker_intercepts_ua_df <- speaker_intercepts_ua_df %>% 
  mutate(sequence = "ua" )

write.csv(speaker_intercepts_ua_df, here("Data", "speaker_intercepts_ua.csv"))
  1. Investigate significant effects
  1. Is there evidence of an overall category effect?
Click here to view code.
hyp.mod.ua.min.cat <- update(hyp.mod.ua, ~ . - category - category:participant_gender -  - category:complex - category:c.(mean_rate_transf))
anova(hyp.mod.ua, hyp.mod.ua.min.cat)
Data: ua
Models:
hyp.mod.ua.min.cat: PC1 ~ participant_gender + complex + c.(mean_rate_transf) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format) + category:complex
hyp.mod.ua: PC1 ~ category * (participant_gender + complex + c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
                   npar   AIC   BIC  logLik deviance  Chisq Df Pr(>Chisq)  
hyp.mod.ua.min.cat   16 12660 12760 -6313.9    12628                       
hyp.mod.ua           22 12659 12797 -6307.3    12615 13.225  6    0.03959 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Yes there is. b) Investigating category differences with an EMM test

Click here to view code.
emmeans(hyp.mod.ua, pairwise ~ category)
$emmeans
 category     emmean    SE  df asymp.LCL asymp.UCL
 Historical   -1.066 0.161 Inf    -1.382    -0.751
 PresentElder -0.583 0.132 Inf    -0.842    -0.325
 L1           -0.838 0.188 Inf    -1.205    -0.470
 L2           -0.546 0.219 Inf    -0.974    -0.118

Results are averaged over the levels of: participant_gender, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: asymptotic 
Confidence level used: 0.95 

$contrasts
 contrast                  estimate    SE  df z.ratio p.value
 Historical - PresentElder  -0.4832 0.166 Inf  -2.904  0.0193
 Historical - L1            -0.2286 0.221 Inf  -1.034  0.7296
 Historical - L2            -0.5204 0.249 Inf  -2.089  0.1568
 PresentElder - L1           0.2546 0.200 Inf   1.275  0.5787
 PresentElder - L2          -0.0372 0.229 Inf  -0.162  0.9985
 L1 - L2                    -0.2918 0.265 Inf  -1.103  0.6880

Results are averaged over the levels of: participant_gender, complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: asymptotic 
P value adjustment: tukey method for comparing a family of 4 estimates 

Only significant differences between historical and present elders (already captured by model terms)

  1. Investigating further by conducting an EMM test on the interaction of category and gender
Click here to view code.
emmeans(hyp.mod.ua, pairwise ~  participant_gender |category) 
$emmeans
category = Historical:
 participant_gender emmean    SE  df asymp.LCL asymp.UCL
 M                  -1.076 0.175 Inf    -1.419    -0.733
 F                  -1.057 0.193 Inf    -1.434    -0.679

category = PresentElder:
 participant_gender emmean    SE  df asymp.LCL asymp.UCL
 M                  -0.411 0.152 Inf    -0.708    -0.114
 F                  -0.755 0.144 Inf    -1.038    -0.473

category = L1:
 participant_gender emmean    SE  df asymp.LCL asymp.UCL
 M                  -0.650 0.211 Inf    -1.064    -0.237
 F                  -1.025 0.207 Inf    -1.432    -0.619

category = L2:
 participant_gender emmean    SE  df asymp.LCL asymp.UCL
 M                  -0.165 0.242 Inf    -0.640     0.311
 F                  -0.927 0.238 Inf    -1.394    -0.461

Results are averaged over the levels of: complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: asymptotic 
Confidence level used: 0.95 

$contrasts
category = Historical:
 contrast estimate    SE  df z.ratio p.value
 M - F     -0.0194 0.177 Inf  -0.109  0.9129

category = PresentElder:
 contrast estimate    SE  df z.ratio p.value
 M - F      0.3441 0.133 Inf   2.582  0.0098

category = L1:
 contrast estimate    SE  df z.ratio p.value
 M - F      0.3752 0.186 Inf   2.023  0.0431

category = L2:
 contrast estimate    SE  df z.ratio p.value
 M - F      0.7627 0.199 Inf   3.833  0.0001

Results are averaged over the levels of: complex, final_pause, prev_c_tongue 
Degrees-of-freedom method: asymptotic 

Significant gender difference in younger speakers only.

  1. Is there evidence of an overall gender effect?
Click here to view code.
hyp.mod.ua.min.gender <- update(hyp.mod.ua, ~ . - participant_gender - category:participant_gender)
anova(hyp.mod.ua, hyp.mod.ua.min.gender)
Data: ua
Models:
hyp.mod.ua.min.gender: PC1 ~ category + complex + c.(mean_rate_transf) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format) + category:complex + category:c.(mean_rate_transf)
hyp.mod.ua: PC1 ~ category * (participant_gender + complex + c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1 | word.alt.format)
                      npar   AIC   BIC  logLik deviance  Chisq Df Pr(>Chisq)
hyp.mod.ua.min.gender   18 12671 12784 -6317.4    12635                     
hyp.mod.ua              22 12659 12797 -6307.3    12615 20.254  4   0.000445
                         
hyp.mod.ua.min.gender    
hyp.mod.ua            ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

yes

10.7 Marginal effects plots

Click here to view code.
 oa$category <- factor(oa$category,
                                       levels = c("Historical", "PresentElder", "L1", "L2"),
                                    labels = c("Historical elders", "Present elders", "Young L1", "Young L2"))


 ua$category <- factor(ua$category,
                                       levels = c("Historical", "PresentElder", "L1", "L2"),
                                    labels = c("Historical elders", "Present elders", "Young L1", "Young L2"))
 
 
 hyp.mod.oa_renamed =  lmer(PC1 ~ category * (participant_gender + moraPositionFactor  + complex  +  c.(mean_rate_transf)) +  final_pause +  prev_c_tongue + (1 | Speaker) + (1  | word.alt.format), data=oa, REML=F)
 
  hyp.mod.ua_renamed =  lmer(PC1 ~ category * (participant_gender+  complex + moraPositionFactor + c.(mean_rate_transf)) +   final_pause  + prev_c_tongue + (1   | Speaker) + (1 | word.alt.format), data=ua, REML=F)

10.7.1 Category and gender effects (Manuscript §4.2.1)

10.7.1.1 /oa/ and /ua/ category * gender (Manuscript Figure 7)

  1. Rename factor levels so that the labels are more informative

  2. Define plots

Click here to view code.
PC1_CatGenderoa  <- plot_model(hyp.mod.oa_renamed, type = "pred", terms = c("category", "participant_gender"), 
      title = "/oa/", axis.title = c(NULL, "uPC1 score: hiatus-like ↔ diphthong-like"), show.legend = F)+  
 labs(
    x = "Speaker Category",  
  ) +
scale_color_manual(
     values = c("M" = "#1F78B4", "F" = "#E31A1C"),  
     labels = c("M" = "Men", "F" = "Women")       
   ) +
 theme_minimal()



PC1_CatGenderua <- plot_model(hyp.mod.ua_renamed, type = "pred", terms = c("category", "participant_gender"), 
      title = "/ua/", axis.title = c(NULL, "uPC1 score: hiatus-like ↔ diphthong-like"))+
   labs(
    x = "Speaker Category",   
    color = "Speaker Gender"  
  )+
scale_color_manual(
     values = c("M" = "#1F78B4", "F" = "#E31A1C"), # Optional: specify colors
     labels = c("M" = "Men", "F" = "Women")       # Update labels for legend
   ) +
 theme_minimal() + theme(legend.position="bottom")
  1. Combine plots and save
Click here to view code.
CatGendercombined <- cowplot::plot_grid(PC1_CatGenderoa, PC1_CatGenderua,  
                            labels = c("a", "b"), ncol = 1, align = "c", axis = "l")

CatGendercombined  

Click here to view code.
ggsave(here( "Figures", "Plots", "RegressionAnalysis", "CatGendercombined.png"),  CatGendercombined, width = 5, height = 9, bg = 'white')

10.7.1.2 /ia/ category and gender (Manuscript Figure 8 and 9)

  1. Rename factor levels so that the labels are more informative
Click here to view code.
 ia$category <- factor(ia$category,
                                       levels = c("Historical", "PresentElder", "L1", "L2"),
                                    labels = c("Historical elders", "Present elders", "Young L1", "Young L2"))

ia$participant_gender <- factor(ia$participant_gender, 
                                       levels = c("M", "F"), 
                                       labels = c("Men", "Women"))

hyp.mod.ia_renamed = lmer(PC1 ~ category * (participant_gender + moraPositionFactor + complex +  c.(mean_rate_transf)) + final_pause + prev_c_tongue + (1 | Speaker) + (1  | word.alt.format), data=ia, REML=F)
  1. Define plots
Click here to view code.
PC1_Genderia <- plot_model(hyp.mod.ia_renamed, type = "pred", terms = c( "participant_gender"), 
           title = " ", axis.title = c("Speaker Gender", "uPC1 score: hiatus-like ↔ diphthong-like")) +
   theme_minimal()



PC1_Categoryia <- plot_model(hyp.mod.ia_renamed, type = "pred", terms = c( "category"), 
           title = " ", axis.title = c("Speaker Category" , "uPC1 score: hiatus-like ↔ diphthong-like")) +
   theme_minimal()
  1. Save
Click here to view code.
ggsave(here("Figures", "Plots", "RegressionAnalysis", "iaPC1Cat.png"),  PC1_Categoryia, height = 10, width = 15, units = "cm", bg = 'white') 

ggsave(here("Figures", "Plots", "RegressionAnalysis", "iaPC1Gender.png"),  PC1_Genderia, height = 10, width = 15, units = "cm", bg = 'white')

10.7.1.3 /ia/ and /oa/ category* mora position (Manuscript Figure 10)

  1. Define plots
Click here to view code.
 PC1_CatMoraPosia <- plot_model(hyp.mod.ia_renamed, type = "pred", terms = c("category", "moraPositionFactor"), 
           title = "/ia/", axis.title = c( "uPC1 score: hiatus-like ↔ diphthong-like"), show.legend = F)+
   labs(
    x = "Speaker Category",   
    color = "Mora position" 
  )+
  scale_color_manual(values = c("1" = "#33A02C", "2" = "#FF7F00", "3+" = "#6A3D9A")) + 
 theme_minimal()


PC1_CatMoraPosoa <- plot_model(hyp.mod.oa_renamed, type = "pred", terms = c("category", "moraPositionFactor"), 
           title = "/oa/", axis.title = c("category", "uPC1 score: hiatus-like ↔ diphthong-like"))+
   labs(
    x = "Speaker Category",   
    color = "Mora position"  
  )+
  scale_color_manual(values = c("1" = "#33A02C", "2" = "#FF7F00", "3+" = "#6A3D9A")) + 
 theme_minimal() + theme(legend.position="bottom")
  1. Combine
Click here to view code.
plots_combined_mora <- cowplot::plot_grid(PC1_CatMoraPosia, PC1_CatMoraPosoa, 
                            labels = c("a", "b"), ncol = 1, align = "c", axis = "l")


 
plots_combined_mora

  1. Save
Click here to view code.
ggsave(here("Figures", "Plots", "RegressionAnalysis", "CatMoracombined.png"),  plots_combined_mora, width = 5, height = 9, bg = 'white')

10.7.1.4 /ea/ category* morpheme boundary (Manuscript Figure 11 )

  1. Rename factor levels so that the labels are more informative
Click here to view code.
 ea$category <- factor(ea$category,
                                       levels = c("Historical", "PresentElder", "L1", "L2"),
                                 labels = c("Historical elders", "Present elders", "Young L1", "Young L2"))

hyp.mod.ea_renamed <-  lmer(PC1 ~ category * (participant_gender +   complex   +c.(mean_rate_transf) ) + final_pause +    prev_c_tongue + (1   | Speaker) + (1  | word.alt.format), data=ea, REML=F) 
Click here to view code.
PC1_CatComplexea <- plot_model(hyp.mod.ea_renamed, type = "pred", terms = c("category", "complex"), 
            title = " ", axis.title = c("Speaker Category", "uPC1 score: hiatus-like ↔ diphthong-like"), 
          legend.title="morpheme boundary") +
  scale_color_manual(values = c("TRUE" = "#018F77", "FALSE" = "#f37735")) + 
  theme_minimal() + 
  theme(legend.position = "bottom")

PC1_CatComplexea

Click here to view code.
ggsave(here("Figures", "Plots", "RegressionAnalysis", "eaPC1CatComplex.png"),  PC1_CatComplexea, height = 10, width = 15, units = "cm", bg = 'white')

10.7.1.5 /ua/ morpheme boundary (Manuscript Figure 12 )

Click here to view code.
 ua$complex <- factor(ua$complex, levels = c("FALSE", "TRUE"))
Click here to view code.
PC1_Complexua <-  plot_model(hyp.mod.ua, type = "pred", terms = c("complex"), 
            title = " ", axis.title = c("morpheme boundary", "uPC1 score: hiatus-like ↔ diphthong-like")) + 
  theme_minimal() + 
  theme(legend.position = "bottom")

PC1_Complexua

Click here to view code.
ggsave(here("Figures", "Plots", "RegressionAnalysis", "uaPC1Complex.png"),  PC1_Complexua, height = 10, width = 15, units = "cm", bg = 'white')

11 Speaker intercept analysis (Manuscript §4.3.1)

11.1 Plot showing distribution of uPC results per speaker (Manuscript Figure 13)

This plot uses a data frame created in Section 8.4.

  1. Filter out mid tokens, count number of high and low uPC1 tokens.
Click here to view code.
per_speaker_PC_results <- results_extreme_all %>% 
  filter(PC1cat != "mid") %>% 
  select(MatchId, Speaker, PC1cat, sequence) %>% 
  group_by(Speaker, sequence, PC1cat) %>% 
  count()
  1. Only include speakers who have all 4 sequences
Click here to view code.
per_speaker_PC_results <- per_speaker_PC_results %>% 
  group_by(Speaker) %>%
  filter(n_distinct(sequence) == 4) %>% 
  ungroup()
  1. Order data, with speakers with most low scoring tokens first
Click here to view code.
speaker_order <- per_speaker_PC_results %>%
  group_by(Speaker) %>%
  mutate(total_n = sum(n)) %>%
  filter(PC1cat == "low") %>%
  summarise(prop_low = sum(n) / first(total_n)) %>%
  arrange(desc(prop_low)) %>%
  pull(Speaker)

per_speaker_PC_results$Speaker <- factor(per_speaker_PC_results$Speaker, levels = speaker_order)
  1. Adjust order of sequences
Click here to view code.
per_speaker_PC_results$sequence <- factor(per_speaker_PC_results$sequence, levels = c("ia", "ea", "oa", "ua"))
  1. Create plot + save
Click here to view code.
per_speaker_plot <- ggplot(per_speaker_PC_results, aes(x = sequence, y = n, fill = PC1cat)) +
  geom_bar(stat = "identity", position = "fill") +
  labs(y = " ", x = "sequence") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 8)) +
   scale_fill_manual(name = "uPC1 Category", values = c("hi" = "#F8766D", "low" = "#00BFC4")) +
  facet_wrap(~ Speaker, nrow = 5) +
 theme(legend.position="bottom")
 
per_speaker_plot

Click here to view code.
ggsave(here("Figures", "Plots", "SpeakerInterceptAnalysis", "PC1ScoresPerSpeakerPerSeq.pdf"), per_speaker_plot, width = 30, height = 15, units = "cm")

11.2 Speaker intercepts analysis + visualisation (Manuscript Figure 14)

  1. Read in data if need be
Click here to view code.
speaker_intercepts_ea <- read.csv(here( "Data", "speaker_intercepts_ea.csv")) %>% 
  select(-X, -sequence) %>% 
  rename(ea_speaker_intercept = Intercept)

speaker_intercepts_ia <- read.csv(here("Data", "speaker_intercepts_ia.csv")) %>% 
  select(-X, -sequence) %>% 
  rename(ia_speaker_intercept = Intercept)

speaker_intercepts_oa <- read.csv(here("Data", "speaker_intercepts_oa.csv")) %>% 
   select(-X, -sequence) %>% 
  rename(oa_speaker_intercept = Intercept)

speaker_intercepts_ua <- read.csv(here("Data", "speaker_intercepts_ua.csv")) %>% 
  select(-X, -sequence) %>% 
  rename(ua_speaker_intercept = Intercept)
  1. Create combined data frame of all intercepts
Click here to view code.
speaker_intercepts_all <- speaker_intercepts_ea %>%
  left_join(speaker_intercepts_ia, by = "Speaker") %>%
  left_join(speaker_intercepts_oa, by = "Speaker") %>%
  left_join(speaker_intercepts_ua, by = "Speaker")

write.csv(speaker_intercepts_all, here("Data","opening_seqs_speaker_intercepts.csv"))
  1. Define function for creating correlation plot. This is an adapted version of the pairscor.fnc() function (used above) from the languageR() package (Baayen 2022). It rounds p values <0.001 as such.
Click here to view code.
pairscor.fnc_custom  <- function(data, hist = TRUE, smooth = TRUE,
  cex.points = 1, col.points = "darkgrey") {
  panel.hist <- function(x, ...) {
    usr <- graphics::par("usr"); on.exit(graphics::par(usr))
    graphics::par(usr = c(usr[1:2], 0, 1.5) )
    h <- hist(x, plot = FALSE)
    breaks <- h$breaks; nB <- length(breaks)
    y <- h$counts; y <- y/max(y)
    graphics::rect(breaks[-nB], 0, breaks[-1], y, ...)
  }

  pairscor.lower <- function(x, y, ...) {
    usr <- graphics::par("usr"); on.exit(graphics::par(usr))
    graphics::par(usr = c(0, 1, 0, 1))
    
    # Pearson correlation
    m = stats::cor.test(x, y)
    r = round(m$estimate, 2)  # Show r with 2 decimal places
    p = m$p.value
    p_display = ifelse(p < 0.001, "<0.001", round(p, 6))  # Modify p-value for display
    rtxt = paste("r =", r)
    ptxt = paste("p =", p_display)

    # Spearman correlation
    options(warn=-1)  # ignore warnings
    m2 = stats::cor.test(x, y, method="spearman")
    r2 = round(m2$estimate, 2)  # Show rs with 2 decimal places
    p2 = m2$p.value
    p2_display = ifelse(p2 < 0.001, "<0.001", round(p2, 4))  # Modify p-value for display
    rtxt2 = paste("rs =", r2)
    ptxt2 = paste("p =", p2_display)
    options(warn=0)

    graphics::text(0.5, 0.8, rtxt)
    graphics::text(0.5, 0.6, ptxt)
    graphics::lines(c(0.2, 0.8), c(0.5, 0.5))
    graphics::text(0.5, 0.4, rtxt2)
    graphics::text(0.5, 0.2, ptxt2)
  }

  panel.smooth2 = function (x, y, col = graphics::par("col"), bg = NA, pch = graphics::par("pch"),
    cex = 1, span = 2/3, iter = 3, ...) {
    graphics::points(x, y, pch = pch, col = col, bg = bg, cex = cex)
    ok <- is.finite(x) & is.finite(y)
    if (any(ok))
        graphics::lines(stats::lowess(x[ok], y[ok], f = span, iter = iter),
            col = "black", ...)
  }

  if (hist == TRUE) {
    if (smooth == TRUE) {
         graphics::pairs(data, 
         diag.panel = panel.hist,
         lower.panel = pairscor.lower, 
         upper.panel = panel.smooth2, col = col.points,
           cex = cex.points)
    } else {
       graphics::pairs(data, 
         diag.panel = panel.hist,
         lower.panel = pairscor.lower) 
    }
  } else {
    if (smooth == TRUE) {
        graphics::pairs(data, lower.panel = pairscor.lower, 
        upper.panel = panel.smooth2, col = col.points,
        cex = cex.points)
    } else {
        graphics::pairs(data, lower.panel = pairscor.lower) 
    }
  }
}
  1. Create plot + save
Click here to view code.
pdf(here("Figures", "Plots", "SpeakerInterceptAnalysis",  "SpeakerInterceptCorrelation.pdf"), width = 7, height = 5)

 
pairscor.fnc_custom(select(speaker_intercepts_all, ia_speaker_intercept, ea_speaker_intercept, oa_speaker_intercept, ua_speaker_intercept))

# Close the device to save the plot
dev.off()
png 
  2 

12 Speaker category visualisations (Manuscript §4.3.2)

  1. Data
Click here to view code.
sequences = read.csv(here("Data", "formants_filtered_all.csv"))  %>% 
  dplyr::select(Vowel,  MatchId,  word, After.Match, category, participant_gender, time, Formant, Frequency, Target.vowelCluster.start, Target.vowelCluster.end)

monophthongs = read.csv(here("Data", "monophthongsfinal.csv"))
  1. Some data prep
Click here to view code.
sequences$participant_gender = as.factor(sequences$participant_gender)
sequences$category = as.factor(sequences$category)
sequences$Vowel = as.factor(sequences$Vowel)

sequences$category_gender = interaction(sequences$participant_gender, sequences$category)
  1. View Data
Click here to view code.
vowels <- sequences
 

vowels %>%
  head(10) %>%
  kable() %>%
  kable_styling(font_size = 11) %>%
  scroll_box(width = "100%")
Vowel MatchId word After.Match category participant_gender time Formant Frequency Target.vowelCluster.start Target.vowelCluster.end category_gender
ea g_12;em_12_903;n_31539-n_31540;p_28;#=ew_69_149484;prefix=00078-;[0]=ew_0_7982 mea hoki PresentElder M 1 F1_lobanov_2.0 -0.7105541 95.284 95.344 M.PresentElder
ea g_12;em_12_903;n_31539-n_31540;p_28;#=ew_69_149484;prefix=00078-;[0]=ew_0_7982 mea hoki PresentElder M 1 F2_lobanov_2.0 0.2266319 95.284 95.344 M.PresentElder
ea g_12;em_12_903;n_31539-n_31540;p_28;#=ew_69_149484;prefix=00078-;[0]=ew_0_7982 mea hoki PresentElder M 2 F1_lobanov_2.0 -0.3871576 95.284 95.344 M.PresentElder
ea g_12;em_12_903;n_31539-n_31540;p_28;#=ew_69_149484;prefix=00078-;[0]=ew_0_7982 mea hoki PresentElder M 2 F2_lobanov_2.0 0.3022614 95.284 95.344 M.PresentElder
ea g_12;em_12_903;n_31539-n_31540;p_28;#=ew_69_149484;prefix=00078-;[0]=ew_0_7982 mea hoki PresentElder M 3 F1_lobanov_2.0 -0.0334427 95.284 95.344 M.PresentElder
ea g_12;em_12_903;n_31539-n_31540;p_28;#=ew_69_149484;prefix=00078-;[0]=ew_0_7982 mea hoki PresentElder M 3 F2_lobanov_2.0 0.3267298 95.284 95.344 M.PresentElder
ea g_12;em_12_903;n_31539-n_31540;p_28;#=ew_69_149484;prefix=00078-;[0]=ew_0_7982 mea hoki PresentElder M 4 F1_lobanov_2.0 0.2192108 95.284 95.344 M.PresentElder
ea g_12;em_12_903;n_31539-n_31540;p_28;#=ew_69_149484;prefix=00078-;[0]=ew_0_7982 mea hoki PresentElder M 4 F2_lobanov_2.0 0.3356274 95.284 95.344 M.PresentElder
ea g_12;em_12_903;n_31539-n_31540;p_28;#=ew_69_149484;prefix=00078-;[0]=ew_0_7982 mea hoki PresentElder M 5 F1_lobanov_2.0 0.3303783 95.284 95.344 M.PresentElder
ea g_12;em_12_903;n_31539-n_31540;p_28;#=ew_69_149484;prefix=00078-;[0]=ew_0_7982 mea hoki PresentElder M 5 F2_lobanov_2.0 0.3067102 95.284 95.344 M.PresentElder
  1. Some more data prep
Click here to view code.
vowels <- vowels %>%
  mutate(preceding = str_match(word, "(.*)[eiou]a")[,2] %>%
           str_extract("(wh|ng|[^:]{0,1}:*)$") %>% 
           str_remove_all(":") %>%
           factor(),
         following = str_match(word, "[eiou]a(.*)")[,2] %>%
           str_extract("^[-:]*(wh|ng|[^:]{0,1}:*)") %>% 
           str_remove_all("[-:]") %>%
           ifelse(.=="", 
                  After.Match %>%
                   str_to_lower() %>% 
                   str_extract("^([<>~?:\"' ]|-)*(wh|ng|.{0,1})") %>%
                   str_remove("[<>~?:\"' -]+") %>% 
                   paste0("$", .),
                 .) %>%
           factor(),
         time_left = exp(-(time-1)/1.5),
         time_right = exp(-(9-time)/1.5),
         duration = Target.vowelCluster.end - Target.vowelCluster.start,
         preceding_category_gender = paste(preceding, category_gender) %>% factor(),
         following_category_gender = paste(following, category_gender) %>% factor(),
  ) %>%
  group_by(MatchId) %>%
  mutate(traj_start=time==min(time)) %>%
  ungroup()
  1. Nest data
Click here to view code.
vowels <- vowels %>%
    group_by(Vowel, Formant) %>%
    nest()
  1. Fit GAMs to the data
Click here to view code.
vowels <- vowels %>%
  mutate(
    model = map(
      data, # We are applying a function to the entries of the `data` column.
      # This is the function we are applying (introduced with a ~)
      ~ bam( 
          # Here's our formula.
          Frequency ~ 
            category_gender +
            s(time, by=category_gender, k=9) +
            s(duration, k=9) + 
            ti(time,duration,k=c(9,9)) +
            s(time_left, preceding_category_gender, bs="re") +
            s(time_right, following_category_gender, bs="re"),
          data = .x,
          method = 'fREML',
          discrete = TRUE,
          AR.start=.x$traj_start, rho=0.7
        )
      )
  )
  1. Get predictions
Click here to view code.
to_predict <- list(
  "time" = seq(from=1, to=9, by=1), # All years
  "category_gender" =
    c("M.L1","M.L2","M.Historical","M.PresentElder",
      "F.L1","F.L2","F.Historical","F.PresentElder"
    )
)


vowels <- vowels %>%
  mutate(
    prediction = map(
      model, # This time we're applying the function to all the models.
      # We again introduce the function with '~', and indicate where the model 
      # goes with '.x'.
      ~ get_predictions(model = .x, cond = to_predict, rm.ranef=T, print.summary = FALSE)
    )
  )
  1. View predictions
Click here to view code.
vowels$prediction[[1]] %>%
    kable() %>%
    kable_styling() %>%
    scroll_box(width = "100%")
category_gender time duration time_left preceding_category_gender time_right following_category_gender fit CI rm.ranef
M.L1 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3001625 0.2184892 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L2 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder -0.1640612 0.2196264 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.Historical 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7094868 0.2141206 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.PresentElder 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.2734123 0.1937801 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L1 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.2205627 0.2131089 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L2 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder -0.2211095 0.2260973 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.Historical 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7048686 0.2472512 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.PresentElder 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3553471 0.2003759 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L1 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7156480 0.1327896 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L2 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.1732826 0.1351625 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.Historical 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0463242 0.1464127 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.PresentElder 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6597681 0.1132917 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L1 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6956143 0.1302862 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L2 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.1317779 0.1406179 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.Historical 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.2555968 0.1548018 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.PresentElder 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7232717 0.1161893 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L1 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0766336 0.0948775 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L2 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.5072483 0.0967902 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.Historical 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3605645 0.1193179 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.PresentElder 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9317287 0.0758709 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L1 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1664112 0.0949919 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L2 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.4976774 0.1028665 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.Historical 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.7134630 0.1168335 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.PresentElder 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9954177 0.0773528 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L1 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3215932 0.0834248 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L2 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7683137 0.0851868 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.Historical 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.5683260 0.1120174 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.PresentElder 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1104969 0.0632759 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L1 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.4898334 0.0849787 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L2 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8151049 0.0916013 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.Historical 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 2.0492417 0.1071094 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.PresentElder 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1457513 0.0645823 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L1 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3912724 0.0818021 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L2 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9395691 0.0833101 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.Historical 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.6649460 0.1124548 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.PresentElder 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.2363837 0.0610670 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L1 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.5967851 0.0842728 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L2 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0228821 0.0902144 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.Historical 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 2.1939633 0.1066237 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.PresentElder 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.2033547 0.0625954 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L1 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3573475 0.0862461 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L2 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0152661 0.0879352 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.Historical 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.6846007 0.1159308 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.PresentElder 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3359165 0.0657450 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L1 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.5553870 0.0893239 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L2 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0814261 0.0956797 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.Historical 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 2.0972918 0.1115566 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.PresentElder 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1707673 0.0679519 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L1 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3075952 0.1039840 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L2 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0041329 0.1057389 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.Historical 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.7350257 0.1306622 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.PresentElder 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3685773 0.0834576 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L1 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.4232194 0.1094167 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L2 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0361559 0.1156048 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.Historical 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.8254579 0.1281818 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.PresentElder 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1056578 0.0878951 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L1 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3293709 0.1543553 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L2 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9732296 0.1579444 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.Historical 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.7113881 0.1784391 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.PresentElder 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3487861 0.1320141 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L1 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.2722696 0.1681584 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L2 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9371674 0.1736587 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.Historical 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3983980 0.1794817 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.PresentElder 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9931836 0.1418941 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L1 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.4305750 0.2623701 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.L2 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0181457 0.2651580 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.Historical 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.7052147 0.2805931 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
M.PresentElder 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3105094 0.2319252 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L1 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1581208 0.2917110 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.L2 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8814072 0.2939164 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.Historical 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8772815 0.2967280 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
F.PresentElder 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8361188 0.2525032 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
  1. Unnest
Click here to view code.
predictions <- vowels %>%
  select(
    Vowel, Formant, prediction
  ) %>%
  unnest(prediction)   

predictions %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
Vowel Formant category_gender time duration time_left preceding_category_gender time_right following_category_gender fit CI rm.ranef
ea F1_lobanov_2.0 M.L1 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3001625 0.2184892 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L2 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder -0.1640612 0.2196264 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.Historical 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7094868 0.2141206 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.PresentElder 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.2734123 0.1937801 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L1 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.2205627 0.2131089 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L2 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder -0.2211095 0.2260973 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.Historical 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7048686 0.2472512 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.PresentElder 1 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3553471 0.2003759 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L1 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7156480 0.1327896 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L2 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.1732826 0.1351625 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.Historical 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0463242 0.1464127 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.PresentElder 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6597681 0.1132917 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L1 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6956143 0.1302862 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L2 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.1317779 0.1406179 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.Historical 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.2555968 0.1548018 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.PresentElder 2 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7232717 0.1161893 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L1 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0766336 0.0948775 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L2 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.5072483 0.0967902 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.Historical 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3605645 0.1193179 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.PresentElder 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9317287 0.0758709 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L1 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1664112 0.0949919 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L2 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.4976774 0.1028665 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.Historical 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.7134630 0.1168335 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.PresentElder 3 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9954177 0.0773528 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L1 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3215932 0.0834248 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L2 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7683137 0.0851868 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.Historical 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.5683260 0.1120174 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.PresentElder 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1104969 0.0632759 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L1 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.4898334 0.0849787 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L2 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8151049 0.0916013 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.Historical 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 2.0492417 0.1071094 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.PresentElder 4 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1457513 0.0645823 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L1 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3912724 0.0818021 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L2 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9395691 0.0833101 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.Historical 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.6649460 0.1124548 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.PresentElder 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.2363837 0.0610670 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L1 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.5967851 0.0842728 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L2 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0228821 0.0902144 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.Historical 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 2.1939633 0.1066237 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.PresentElder 5 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.2033547 0.0625954 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L1 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3573475 0.0862461 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L2 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0152661 0.0879352 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.Historical 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.6846007 0.1159308 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.PresentElder 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3359165 0.0657450 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L1 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.5553870 0.0893239 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L2 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0814261 0.0956797 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.Historical 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 2.0972918 0.1115566 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.PresentElder 6 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1707673 0.0679519 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L1 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3075952 0.1039840 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L2 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0041329 0.1057389 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.Historical 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.7350257 0.1306622 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.PresentElder 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3685773 0.0834576 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L1 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.4232194 0.1094167 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L2 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0361559 0.1156048 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.Historical 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.8254579 0.1281818 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.PresentElder 7 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1056578 0.0878951 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L1 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3293709 0.1543553 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L2 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9732296 0.1579444 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.Historical 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.7113881 0.1784391 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.PresentElder 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3487861 0.1320141 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L1 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.2722696 0.1681584 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L2 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9371674 0.1736587 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.Historical 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3983980 0.1794817 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.PresentElder 8 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9931836 0.1418941 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L1 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.4305750 0.2623701 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.L2 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.0181457 0.2651580 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.Historical 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.7052147 0.2805931 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 M.PresentElder 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.3105094 0.2319252 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L1 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 1.1581208 0.2917110 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.L2 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8814072 0.2939164 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.Historical 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8772815 0.2967280 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F1_lobanov_2.0 F.PresentElder 9 0.14 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8361188 0.2525032 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L1 1 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.4922088 0.2246960 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L2 1 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9291806 0.1522655 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.Historical 1 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6521965 0.2496705 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.PresentElder 1 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6664922 0.1243063 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L1 1 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.5966031 0.2295400 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L2 1 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8688500 0.2686616 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.Historical 1 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8484837 0.2418428 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.PresentElder 1 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8174768 0.1376608 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L1 2 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.4910429 0.1325887 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L2 2 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9600434 0.1031537 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.Historical 2 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6957933 0.1512226 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.PresentElder 2 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7124294 0.0803477 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L1 2 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.5591760 0.1346864 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L2 2 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9100470 0.1554924 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.Historical 2 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8560459 0.1438448 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.PresentElder 2 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8635654 0.0859107 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L1 3 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.4682455 0.0801749 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L2 3 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9742385 0.0717879 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.Historical 3 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6913795 0.0962697 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.PresentElder 3 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7402585 0.0541084 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L1 3 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.5145208 0.0812502 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L2 3 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8769327 0.0931471 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.Historical 3 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8165425 0.0885678 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.PresentElder 3 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8879651 0.0557313 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L1 4 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3820985 0.0590105 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L2 4 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.9151735 0.0566883 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.Historical 4 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6326952 0.0751082 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.PresentElder 4 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7040187 0.0424701 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L1 4 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.4086794 0.0600150 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L2 4 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7568812 0.0687092 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.Historical 4 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6987645 0.0666320 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.PresentElder 4 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.8390508 0.0428010 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L1 5 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.2601021 0.0532132 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L2 5 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7881027 0.0522805 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.Historical 5 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.5776150 0.0697413 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.PresentElder 5 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6098855 0.0392838 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L1 5 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.2706918 0.0543324 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L2 5 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.5650271 0.0618714 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.Historical 5 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.5164629 0.0608935 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.PresentElder 5 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.7272027 0.0394221 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L1 6 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.1404017 0.0546612 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L2 6 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.6274865 0.0546266 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.Historical 6 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.5040741 0.0708108 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.PresentElder 6 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.4876445 0.0411452 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L1 6 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.1160367 0.0561632 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L2 6 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3686113 0.0632185 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.Historical 6 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3202945 0.0624064 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.PresentElder 6 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.5881455 0.0414005 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L1 7 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.0595389 0.0654527 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L2 7 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.4781836 0.0653608 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.Historical 7 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.4330090 0.0811533 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.PresentElder 7 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3754976 0.0499304 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L1 7 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder -0.0070427 0.0684284 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L2 7 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.2179652 0.0753367 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.Historical 7 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.1597211 0.0735968 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.PresentElder 7 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.4617515 0.0510936 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L1 8 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.0106909 0.0962643 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L2 8 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3454312 0.0890375 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.Historical 8 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3800961 0.1119831 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.PresentElder 8 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.2772827 0.0707516 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L1 8 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder -0.0698587 0.1028943 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L2 8 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.1184364 0.1112121 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.Historical 8 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.0537204 0.1063065 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.PresentElder 8 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3515380 0.0750362 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L1 9 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder -0.0645986 0.1553438 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.L2 9 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.1837021 0.1278763 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.Historical 9 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.3057793 0.1737852 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 M.PresentElder 9 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.1487549 0.1067346 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L1 9 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder -0.1484262 0.1688187 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.L2 9 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.0133590 0.1826465 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.Historical 9 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder -0.0524787 0.1694215 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ea F2_lobanov_2.0 F.PresentElder 9 0.15 0.0694835 m M.PresentElder 0.0694835 $k F.PresentElder 0.2127523 0.1174071 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L1 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.0997887 0.2117211 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L2 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.3781810 0.2314996 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.Historical 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.5829025 0.2089889 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.PresentElder 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.6665813 0.1742107 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L1 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.0763600 0.2315377 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L2 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.1334826 0.2296687 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.Historical 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.3502599 0.2020059 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.PresentElder 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.5950540 0.1709972 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L1 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.5197815 0.1404369 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L2 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.0310299 0.1533618 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.Historical 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.3026589 0.1350182 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.PresentElder 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.5136457 0.1103282 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L1 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.3844793 0.1471848 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L2 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.6207663 0.1497771 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.Historical 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.0165004 0.1326253 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.PresentElder 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.3667191 0.1067365 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L1 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.8768883 0.1110931 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L2 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.2991202 0.1203484 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.Historical 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.0552478 0.1043728 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.PresentElder 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.3135870 0.0792615 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L1 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.8108229 0.1123238 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L2 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.0560495 0.1169580 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.Historical 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.2893908 0.1039808 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.PresentElder 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.1322028 0.0761443 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L1 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.1046870 0.1025901 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L2 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.5955704 0.1105900 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.Historical 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.3999274 0.0961852 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.PresentElder 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.0820086 0.0692153 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L1 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.0873304 0.1028591 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L2 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.3376638 0.1081053 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.Historical 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.5411318 0.0966590 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.PresentElder 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.0805882 0.0665418 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L1 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.2069399 0.1014552 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L2 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.8481927 0.1093071 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.Historical 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.6559427 0.0955477 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.PresentElder 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.1499617 0.0674965 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L1 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.2028981 0.1022400 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L2 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.4765202 0.1072545 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.Historical 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.7362061 0.0965209 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.PresentElder 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.2756714 0.0654265 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L1 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.2483783 0.1054535 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L2 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.9571255 0.1130541 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.Historical 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.7807075 0.0994637 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.PresentElder 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.3653211 0.0710930 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L1 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.1640800 0.1066662 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L2 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.4426837 0.1104160 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.Historical 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.7959421 0.1005614 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.PresentElder 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.4251115 0.0696354 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L1 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.2648664 0.1190661 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L2 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.9747907 0.1282602 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.Historical 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.8194557 0.1144033 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.PresentElder 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.5314148 0.0856094 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L1 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.0726381 0.1236096 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L2 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.3264232 0.1265702 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.Historical 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.7478940 0.1179230 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.PresentElder 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.5015352 0.0851977 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L1 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.2812868 0.1631296 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L2 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.9595316 0.1749371 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.Historical 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.7589463 0.1609440 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.PresentElder 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.6448426 0.1267093 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L1 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.9747998 0.1774387 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L2 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.2134142 0.1772082 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.Historical 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.6004375 0.1697178 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.PresentElder 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.5371529 0.1293820 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L1 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.2629497 0.2588524 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.L2 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.9107309 0.2729093 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.Historical 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.7072584 0.2615516 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 M.PresentElder 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.7298395 0.2060156 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L1 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.8920735 0.2946223 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.L2 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.1272453 0.2879573 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.Historical 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.4036119 0.2779696 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F1_lobanov_2.0 F.PresentElder 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.5804067 0.2152643 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L1 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.2006944 0.2355463 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L2 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.1021175 0.2291042 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.Historical 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.3766937 0.2456334 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.PresentElder 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.6487123 0.1388480 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L1 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.8946722 0.2748720 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L2 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.9818566 0.2455966 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.Historical 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.3589178 0.2198699 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.PresentElder 1 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.6085773 0.1877423 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L1 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.0059491 0.1431443 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L2 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.0671022 0.1482100 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.Historical 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.3372551 0.1499189 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.PresentElder 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.5775826 0.0933223 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L1 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.7645492 0.1614770 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L2 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.8560081 0.1522520 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.Historical 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.2288707 0.1373190 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.PresentElder 2 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.5316525 0.1114413 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L1 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.7532821 0.0953181 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L2 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.9472503 0.1020727 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.Historical 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.1880263 0.0963548 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.PresentElder 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.4338974 0.0657239 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L1 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.6249866 0.1037283 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L2 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.6797716 0.1016642 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.Historical 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.0412112 0.0915289 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.PresentElder 3 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.3663739 0.0697892 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L1 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.4994538 0.0783799 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L2 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.7878063 0.0843904 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.Historical 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.0035505 0.0759853 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.PresentElder 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.2401601 0.0532600 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L1 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.4173596 0.0832365 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L2 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.4960706 0.0830810 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.Historical 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.8253418 0.0742863 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.PresentElder 4 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.1500961 0.0540039 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L1 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.2901241 0.0743692 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L2 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.6114290 0.0801855 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.Historical 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.8389249 0.0709473 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.PresentElder 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 1.0337829 0.0498940 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L1 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.2282215 0.0782441 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L2 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.3548359 0.0784463 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.Historical 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.6199382 0.0702554 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.PresentElder 5 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.9409887 0.0501827 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L1 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.1222916 0.0763450 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L2 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.4470152 0.0823581 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.Historical 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.6906841 0.0729151 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.PresentElder 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.8189543 0.0522771 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L1 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.1316718 0.0802042 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L2 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.2419016 0.0805427 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.Historical 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.4465135 0.0728724 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.PresentElder 6 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.7321416 0.0523828 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L1 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.0032129 0.0868271 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L2 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.2947846 0.0943480 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.Historical 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.5478419 0.0844677 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.PresentElder 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.5836403 0.0622535 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L1 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.0202962 0.0929474 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L2 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.1393505 0.0924991 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.Historical 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.2829982 0.0862404 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.PresentElder 7 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.5069119 0.0635422 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L1 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.0984814 0.1188023 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L2 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.1686698 0.1275796 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.Historical 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.4408077 0.1180936 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.PresentElder 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.3672560 0.0850393 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L1 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.0842216 0.1326383 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L2 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.0611005 0.1276495 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.Historical 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.1396774 0.1229940 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.PresentElder 8 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.3263384 0.0950954 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L1 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.1665140 0.1863929 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.L2 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.0864138 0.1902631 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.Historical 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.3759134 0.1841790 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 M.PresentElder 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.1861423 0.1239712 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L1 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder -0.1105423 0.2157775 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.L2 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.0200046 0.1972245 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.Historical 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.0118404 0.1920415 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ia F2_lobanov_2.0 F.PresentElder 9 0.12 0.0694835 k F.PresentElder 0.0694835 $m M.PresentElder 0.2038846 0.1561357 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L1 1 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.3320531 0.1608778 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L2 1 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.0462805 0.1567411 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.Historical 1 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.6357007 0.1630585 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.PresentElder 1 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.3484763 0.1408889 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L1 1 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.4080167 0.1722747 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L2 1 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.1052505 0.1747370 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.Historical 1 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.6132302 0.1718481 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.PresentElder 1 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.3233672 0.1355562 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L1 2 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.4567579 0.1189370 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L2 2 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.1049556 0.1294649 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.Historical 2 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.8930277 0.1229716 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.PresentElder 2 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.4878892 0.1018789 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L1 2 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.6656434 0.1267819 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L2 2 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.1841778 0.1322137 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.Historical 2 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.8175005 0.1254210 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.PresentElder 2 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.4257646 0.0917885 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L1 3 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.5988582 0.1018519 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L2 3 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.1846186 0.1129068 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.Historical 3 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.1463115 0.1093473 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.PresentElder 3 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.6341633 0.0846259 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L1 3 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.8957940 0.1110195 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L2 3 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.3128188 0.1162972 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.Historical 3 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.0078576 0.1082612 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.PresentElder 3 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.5558908 0.0726754 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L1 4 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.7564628 0.0972466 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L2 4 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.2988489 0.1053223 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.Historical 4 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.3729802 0.1063894 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.PresentElder 4 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.8040121 0.0792534 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L1 4 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.0994957 0.1076636 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L2 4 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.4879479 0.1129219 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.Historical 4 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.1753604 0.1043849 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.PresentElder 4 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.7140244 0.0671404 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L1 5 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.8542365 0.0979391 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L2 5 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.3882247 0.1061334 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.Historical 5 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.4921900 0.1080774 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.PresentElder 5 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.9376229 0.0793742 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L1 5 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.2343256 0.1082122 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L2 5 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.6198595 0.1144002 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.Historical 5 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.2570224 0.1053896 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.PresentElder 5 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.8210124 0.0671934 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L1 6 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.8798156 0.1028835 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L2 6 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.4620797 0.1152926 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.Historical 6 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.5053416 0.1129022 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.PresentElder 6 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.0410503 0.0839636 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L1 6 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.2815649 0.1135724 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L2 6 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.6885424 0.1200347 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.Historical 6 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.2529942 0.1104894 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.PresentElder 6 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.8734318 0.0722879 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L1 7 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.9019804 0.1196928 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L2 7 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.5664867 0.1332346 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.Historical 7 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.4676657 0.1311609 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.PresentElder 7 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.1397007 0.0997233 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L1 7 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.1483091 0.1328983 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L2 7 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.7386033 0.1384426 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.Historical 7 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.2167629 0.1293098 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.PresentElder 7 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.9148799 0.0897950 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L1 8 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.9724924 0.1650196 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L2 8 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.7059625 0.1607847 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.Historical 8 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.4458131 0.1857610 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.PresentElder 8 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.2355620 0.1406809 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L1 8 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.0058460 0.1896329 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L2 8 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.8119567 0.1891669 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.Historical 8 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.1353193 0.1818440 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.PresentElder 8 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.9670035 0.1357754 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L1 9 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.0471206 0.2490580 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.L2 9 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.8300309 0.1992690 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.Historical 9 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.4150450 0.2943231 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 M.PresentElder 9 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.3041443 0.2155263 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L1 9 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.8904695 0.3100936 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.L2 9 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.9145564 0.2843897 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.Historical 9 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 0.9601798 0.2869582 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F1_lobanov_2.0 F.PresentElder 9 0.15 0.0694835 t F.PresentElder 0.0694835 $k F.PresentElder 1.0180428 0.2203483 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L1 1 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.5680070 0.1076292 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L2 1 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.3531310 0.1790910 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.Historical 1 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.5195445 0.1085395 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.PresentElder 1 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.2492389 0.0907854 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L1 1 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.8245973 0.1430719 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L2 1 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.7721886 0.1602049 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.Historical 1 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.6145145 0.1397479 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.PresentElder 1 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.6097911 0.0803665 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L1 2 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.5418458 0.0867217 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L2 2 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.4928287 0.1158382 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.Historical 2 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.5048524 0.0888211 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.PresentElder 2 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.2472241 0.0722231 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L1 2 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.7400612 0.1015804 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L2 2 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.7031591 0.1105707 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.Historical 2 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.6020526 0.0988295 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.PresentElder 2 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.5770698 0.0615756 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L1 3 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.4931454 0.0709955 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L2 3 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.5541892 0.0850319 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.Historical 3 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.4676146 0.0737527 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.PresentElder 3 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.2226724 0.0587733 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L1 3 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.6295545 0.0763926 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L2 3 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.5925675 0.0825792 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.Historical 3 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.5588528 0.0737796 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.PresentElder 3 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.5218112 0.0491430 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L1 4 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.4066453 0.0605030 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L2 4 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.5330324 0.0750868 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.Historical 4 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.3925810 0.0636404 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.PresentElder 4 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.1603219 0.0499589 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L1 4 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.4867382 0.0649761 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L2 4 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.4376722 0.0713103 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.Historical 4 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.4712048 0.0623808 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.PresentElder 4 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.4287526 0.0418519 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L1 5 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.3006360 0.0566958 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L2 5 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.4657958 0.0732588 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.Historical 5 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.2980417 0.0602614 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.PresentElder 5 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.0784637 0.0466213 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L1 5 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.3328491 0.0620860 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L2 5 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.2712481 0.0687508 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.Historical 5 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.3543654 0.0595959 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.PresentElder 5 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.3161857 0.0394658 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L1 6 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.1708270 0.0605461 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L2 6 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.3369231 0.0751947 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.Historical 6 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.1797143 0.0646288 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.PresentElder 6 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.9728099 0.0495768 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L1 6 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.1619129 0.0654427 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L2 6 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.0984981 0.0716889 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.Historical 6 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.2045438 0.0629698 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.PresentElder 6 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.1798221 0.0420917 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L1 7 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.0312576 0.0710688 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L2 7 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.1599490 0.0846507 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.Historical 7 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.0516413 0.0754499 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.PresentElder 7 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.8574008 0.0581045 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L1 7 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.9915839 0.0775064 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L2 7 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.9320020 0.0835204 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.Historical 7 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.0475429 0.0745209 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.PresentElder 7 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -1.0337022 0.0494775 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L1 8 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.8890966 0.0868724 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L2 8 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.9661632 0.1135404 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.Historical 8 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.9209775 0.0909798 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.PresentElder 8 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.7394008 0.0712997 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L1 8 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.8288830 0.1035398 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L2 8 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.7770915 0.1122345 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.Historical 8 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.8918058 0.0992183 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.PresentElder 8 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.8849907 0.0619049 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L1 9 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.7718722 0.1078162 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.L2 9 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.7682889 0.1729654 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.Historical 9 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.8152560 0.1110403 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 M.PresentElder 9 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.6463364 0.0896547 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L1 9 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.6961438 0.1459016 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.L2 9 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.6470705 0.1626295 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.Historical 9 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.7650758 0.1397592 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
oa F2_lobanov_2.0 F.PresentElder 9 0.16 0.0694835 t F.PresentElder 0.0694835 F.PresentElder -0.7612145 0.0806811 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L1 1 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.3458264 0.2032429 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L2 1 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.2630743 0.2144019 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.Historical 1 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5148501 0.1931262 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.PresentElder 1 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.6629920 0.1779310 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L1 1 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.0489937 0.2075669 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L2 1 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.1903167 0.2068916 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.Historical 1 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.2567656 0.2036616 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.PresentElder 1 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.3514289 0.1822802 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L1 2 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.1258961 0.1196673 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L2 2 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.2438807 0.1281166 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.Historical 2 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.2869218 0.1171422 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.PresentElder 2 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5478937 0.1031562 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L1 2 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.2440951 0.1205073 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L2 2 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.0252263 0.1258503 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.Historical 2 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.0032032 0.1234535 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.PresentElder 2 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.1590819 0.1031103 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L1 3 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.1158524 0.0801916 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L2 3 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.2151078 0.0872961 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.Historical 3 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.0321349 0.0825955 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.PresentElder 3 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.3821925 0.0666317 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L1 3 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.4956332 0.0797564 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L2 3 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.2645472 0.0863811 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.Historical 3 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.2294903 0.0866463 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.PresentElder 3 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.0424523 0.0642096 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L1 4 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.3453885 0.0669708 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L2 4 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.1118357 0.0731030 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.Historical 4 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.2915026 0.0722450 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.PresentElder 4 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.1940384 0.0536898 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L1 4 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.7088342 0.0664230 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L2 4 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.4770963 0.0734504 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.Historical 4 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.4230145 0.0751549 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.PresentElder 4 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.2118795 0.0500746 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L1 5 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.4866634 0.0639868 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L2 5 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.0549818 0.0697623 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.Historical 5 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.4608548 0.0704539 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.PresentElder 5 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.0012640 0.0506561 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L1 5 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.8352572 0.0635549 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L2 5 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.6105533 0.0708046 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.Historical 5 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.5451461 0.0729696 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.PresentElder 5 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.3109398 0.0468985 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L1 6 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.5322444 0.0660415 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L2 6 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.2445476 0.0723522 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.Historical 6 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.5579220 0.0729575 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.PresentElder 6 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.1764333 0.0530143 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L1 6 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.8368582 0.0654949 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L2 6 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.6776683 0.0729750 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.Historical 6 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.5789605 0.0758442 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.PresentElder 6 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.3728042 0.0496334 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L1 7 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.5576756 0.0770342 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L2 7 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.3889501 0.0831100 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.Historical 7 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.6269177 0.0834919 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.PresentElder 7 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.3230213 0.0637279 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L1 7 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.7942745 0.0762240 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L2 7 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.6987913 0.0838203 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.Historical 7 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.5414097 0.0871329 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.PresentElder 7 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.3926049 0.0619279 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L1 8 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.5510397 0.1104254 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L2 8 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.4701912 0.1158211 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.Historical 8 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.6921493 0.1179292 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.PresentElder 8 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.4219218 0.0951897 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L1 8 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.6964216 0.1099409 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L2 8 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.6920777 0.1175566 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.Historical 8 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.4022273 0.1217710 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.PresentElder 8 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.4102104 0.0968117 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L1 9 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.6296186 0.1830740 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.L2 9 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.5011316 0.1880490 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.Historical 9 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.7598430 0.1928843 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 M.PresentElder 9 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.4827180 0.1613996 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L1 9 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.6154694 0.1837967 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.L2 9 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.6773166 0.1891224 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.Historical 9 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.2387281 0.1983891 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F1_lobanov_2.0 F.PresentElder 9 0.12 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder 0.3830130 0.1688658 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L1 1 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.0248478 0.1916328 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L2 1 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.8182464 0.2498812 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.Historical 1 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.2013576 0.0986634 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.PresentElder 1 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.0358430 0.0896264 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L1 1 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.2345260 0.2175854 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L2 1 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.2511930 0.2083782 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.Historical 1 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.2515073 0.1582345 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.PresentElder 1 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.2851035 0.1064506 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L1 2 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.0682566 0.1111785 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L2 2 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.9799381 0.1386864 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.Historical 2 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.1592437 0.0742018 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.PresentElder 2 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.0241752 0.0611146 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L1 2 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.2351645 0.1226557 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L2 2 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.1793635 0.1223270 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.Historical 2 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.2286091 0.1016769 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.PresentElder 2 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.2319000 0.0662173 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L1 3 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.0505126 0.0658711 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L2 3 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.0316775 0.0802531 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.Historical 3 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.0835803 0.0567484 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.PresentElder 3 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.9787598 0.0428600 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L1 3 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.1657437 0.0708119 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L2 3 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.0568807 0.0732706 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.Historical 3 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.1694975 0.0664450 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.PresentElder 3 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.1401245 0.0420970 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L1 4 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.9875505 0.0475574 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L2 4 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.9921835 0.0567273 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.Historical 4 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.9986713 0.0461253 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.PresentElder 4 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.9220610 0.0336429 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L1 4 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.0525109 0.0497520 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L2 4 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.9127804 0.0533818 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.Historical 4 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.0926896 0.0506018 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.PresentElder 4 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -1.0435819 0.0315704 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L1 5 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.8975487 0.0424258 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L2 5 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.8955316 0.0495966 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.Historical 5 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.9028343 0.0422133 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.PresentElder 5 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.8510269 0.0307636 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L1 5 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.9322567 0.0435172 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L2 5 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.7776602 0.0478109 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.Historical 5 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.9924274 0.0462904 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.PresentElder 5 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.9440709 0.0287744 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L1 6 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.7964543 0.0437970 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L2 6 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.7786856 0.0503788 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.Historical 6 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.7980587 0.0449497 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.PresentElder 6 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.7702006 0.0326836 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L1 6 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.8412302 0.0447468 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L2 6 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.6650387 0.0491906 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.Historical 6 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.8715324 0.0485159 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.PresentElder 6 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.8410327 0.0305975 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L1 7 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.6798461 0.0535525 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L2 7 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.6642930 0.0598985 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.Historical 7 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.6858195 0.0541525 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.PresentElder 7 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.6836344 0.0401709 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L1 7 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.7510732 0.0547514 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L2 7 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5808619 0.0593235 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.Historical 7 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.7409180 0.0587837 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.PresentElder 7 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.7328884 0.0388505 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L1 8 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.6055793 0.0813179 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L2 8 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5546495 0.0891052 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.Historical 8 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5897870 0.0697763 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.PresentElder 8 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.6149859 0.0556255 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L1 8 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.7136961 0.0838022 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L2 8 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5244095 0.0881638 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.Historical 8 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.6401956 0.0836098 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.PresentElder 8 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.6426536 0.0586883 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L1 9 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5692751 0.1343728 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.L2 9 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5163865 0.1510082 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.Historical 9 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5166009 0.0920063 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 M.PresentElder 9 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5680177 0.0803927 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L1 9 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.6900471 0.1417363 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.L2 9 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5083041 0.1433018 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.Historical 9 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5708115 0.1261188 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
ua F2_lobanov_2.0 F.PresentElder 9 0.13 0.0694835 k F.PresentElder 0.0694835 $k F.PresentElder -0.5756487 0.0926003 s(time_left,preceding_category_gender),s(time_right,following_category_gender)
  1. Format predictions
Click here to view code.
predictions <- predictions %>%
   select( # Remove unneeded variables
     -CI, -duration, -time_left, -time_right, -preceding_category_gender, -following_category_gender, -rm.ranef
   ) %>%
  pivot_wider( # Pivot
    names_from = Formant,
    values_from = fit
  )

predictions %>%
  head() %>%
  kable() %>%
  kable_styling() %>%
  scroll_box(width = "100%")
Vowel category_gender time F1_lobanov_2.0 F2_lobanov_2.0
ea M.L1 1 0.3001625 0.4922088
ea M.L2 1 -0.1640612 0.9291806
ea M.Historical 1 0.7094868 0.6521965
ea M.PresentElder 1 0.2734123 0.6664922
ea F.L1 1 0.2205627 0.5966031
ea F.L2 1 -0.2211095 0.8688500
Click here to view code.
predictions <- predictions %>%
  mutate(category = str_remove(category_gender, ".*[.]"),
         participant_gender = str_remove(category_gender, "[.].*"),)
  1. Prepare data sets for each speaker category
Click here to view code.
PresentElderseq = predictions %>%
    filter(category == "PresentElder")
Historicalseq = predictions %>%
    filter(category == "Historical")
L1seq = predictions %>%
    filter(category == "L1")
L2seq = predictions %>%
    filter(category == "L2")

PresentEldermono = monophthongs %>%
    filter(category == "PresentElder")
Historicalmono = monophthongs %>%
    filter(category == "Historical")
L1mono = monophthongs %>%
    filter(category == "L1")
L2mono = monophthongs %>%
    filter(category == "L2")

presentfirst_obs <- PresentElderseq %>%
    group_by(Vowel, participant_gender) %>%
    slice(which.min(time))
histfirst_obs <- Historicalseq %>%
    group_by(Vowel, participant_gender) %>%
    slice(which.min(time))
L1first_obs <- L1seq %>%
    group_by(Vowel, participant_gender) %>%
    slice(which.min(time))
L2first_obs <- L2seq %>%
    group_by(Vowel, participant_gender) %>%
    slice(which.min(time))

##Historical elders plot

  1. Calculate the mean for each vowel to annotate ellipses on plot
Click here to view code.
Hist_i_means <- Historicalmono %>% 
  filter(Target.teAkaSegment == "i") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
Hist_e_means <- Historicalmono %>% 
  filter(Target.teAkaSegment == "e") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
Hist_a_means <- Historicalmono %>% 
  filter(Target.teAkaSegment == "a") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
Hist_o_means <- Historicalmono %>% 
  filter(Target.teAkaSegment == "o") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  

Hist_u_means <- Historicalmono %>% 
  filter(Target.teAkaSegment == "u") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
Historicalmono_means <- rbind(Hist_i_means, Hist_e_means, Hist_a_means, Hist_o_means, Hist_u_means) %>% 
  rename(F1_lobanov_2.0 = meanF1) %>% 
  rename(F2_lobanov_2.0 = meanF2)
  1. Create plot
Click here to view code.
hist_plot <- Historicalmono %>%
  ggplot(aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, colour = Target.teAkaSegment)) +
 stat_ellipse(level = 0.67, geom = "polygon", alpha = 0.1, aes(fill = Target.teAkaSegment), show.legend = FALSE) +
  scale_x_reverse() + scale_y_reverse() +
  geom_text(data=Historicalmono_means,
            aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, label = Target.teAkaSegment),  show.legend = FALSE, size = 3) +
  geom_path(data=Historicalseq, aes(
      x = F2_lobanov_2.0,
      y = F1_lobanov_2.0,
      colour = Vowel), arrow = arrow(length = unit(2, "mm")), show.legend = FALSE) +
    geom_label(
    data = histfirst_obs,
    aes(
      x = F2_lobanov_2.0,
      y = F1_lobanov_2.0,
      colour = Vowel, label=Vowel), 
    show.legend = FALSE,
    size = 2.5, # Make labels smaller...
    alpha = 0.7 # ...and slightly transparent.
  )   

hist_gender <- hist_plot +   labs(title = "Historical elders")  + facet_grid(~ participant_gender)   + theme_classic()+
theme( text = element_text(size = 8))

hist_gender

12.1 Present elders plot

  1. Calculate the mean for each vowel to annotate ellipses on plot
Click here to view code.
PE_i_means <- PresentEldermono %>% 
  filter(Target.teAkaSegment == "i") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
PE_e_means <- PresentEldermono %>% 
  filter(Target.teAkaSegment == "e") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
PE_a_means <- PresentEldermono %>% 
  filter(Target.teAkaSegment == "a") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
PE_o_means <- PresentEldermono %>% 
  filter(Target.teAkaSegment == "o") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  

PE_u_means <- PresentEldermono %>% 
  filter(Target.teAkaSegment == "u") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
PresentEldermono_means <- rbind(PE_i_means, PE_e_means, PE_a_means, PE_o_means, PE_u_means) %>% 
  rename(F1_lobanov_2.0 = meanF1) %>% 
  rename(F2_lobanov_2.0 = meanF2)
  1. Create plot
Click here to view code.
present_plot <- PresentEldermono %>%
  ggplot(aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, colour = Target.teAkaSegment)) +
 stat_ellipse(level = 0.67, geom = "polygon", alpha = 0.1, aes(fill = Target.teAkaSegment), show.legend = FALSE) +
  scale_x_reverse() + scale_y_reverse() +
    geom_text(data= PresentEldermono_means,
            aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, label = Target.teAkaSegment),  show.legend = FALSE, size = 3) +
  geom_path(data=PresentElderseq, aes(
      x = F2_lobanov_2.0,
      y = F1_lobanov_2.0,
      colour = Vowel), arrow = arrow(length = unit(2, "mm")), show.legend = FALSE) +
    geom_label(
    data = presentfirst_obs,
    aes(
      x = F2_lobanov_2.0,
      y = F1_lobanov_2.0,
      colour = Vowel, label=Vowel), 
    show.legend = FALSE,
    size = 2.5, # Make labels smaller...
    alpha = 0.7 # ...and slightly transparent.
  )

present_gender <- present_plot + labs(title = "Present elders") + facet_grid(~ participant_gender)    + theme_classic()+
theme( text = element_text(size = 8))

present_gender

12.2 L1 plot

  1. Calculate the mean for each vowel to annotate ellipses on plot
Click here to view code.
L1_i_means <- L1mono %>% 
  filter(Target.teAkaSegment == "i") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
L1_e_means <- L1mono %>% 
  filter(Target.teAkaSegment == "e") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
L1_a_means <- L1mono %>% 
  filter(Target.teAkaSegment == "a") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
L1_o_means <- L1mono %>% 
  filter(Target.teAkaSegment == "o") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  

L1_u_means <- L1mono %>% 
  filter(Target.teAkaSegment == "u") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
L1mono_means <- rbind(L1_i_means, L1_e_means, L1_a_means, L1_o_means, L1_u_means) %>% 
  rename(F1_lobanov_2.0 = meanF1) %>% 
  rename(F2_lobanov_2.0 = meanF2)
  1. Create plot
Click here to view code.
L1_plot <- L1mono %>%
  ggplot(aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, colour = Target.teAkaSegment)) +
 stat_ellipse(level = 0.67, geom = "polygon", alpha = 0.1, aes(fill = Target.teAkaSegment), show.legend = FALSE) +
  scale_x_reverse() + scale_y_reverse() +
   geom_text(data=L1mono_means,
            aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, label = Target.teAkaSegment),  show.legend = FALSE, size = 3) +
  geom_path(data=L1seq, aes(
      x = F2_lobanov_2.0,
      y = F1_lobanov_2.0,
      colour = Vowel), arrow = arrow(length = unit(2, "mm")), show.legend = FALSE) +
    geom_label(
    data = L1first_obs,
    aes(
      x = F2_lobanov_2.0,
      y = F1_lobanov_2.0,
      colour = Vowel, label=Vowel), 
    show.legend = FALSE,
    size = 2.5, # Make labels smaller...
    alpha = 0.7 # ...and slightly transparent.
  ) 

L1_gender <- L1_plot + labs(title = "Young L1")  + facet_grid(~ participant_gender) + theme_classic()+
theme( text = element_text(size = 8))
  
L1_gender

12.3 L2 plot

  1. Calculate the mean for each vowel to annotate ellipses on plot
Click here to view code.
L2_i_means <- L2mono %>% 
  filter(Target.teAkaSegment == "i") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
L2_e_means <- L2mono %>% 
  filter(Target.teAkaSegment == "e") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
L2_a_means <- L2mono %>% 
  filter(Target.teAkaSegment == "a") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
L2_o_means <- L2mono %>% 
  filter(Target.teAkaSegment == "o") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  

L2_u_means <- L2mono %>% 
  filter(Target.teAkaSegment == "u") %>% 
  mutate(meanF1 = mean(F1_lobanov_2.0)) %>% 
  mutate(meanF2 = mean(F2_lobanov_2.0)) %>% 
  select(Target.teAkaSegment, meanF1, meanF2) %>% 
  unique()
  
L2mono_means <- rbind(L2_i_means, L2_e_means, L2_a_means, L2_o_means, L2_u_means) %>% 
  rename(F1_lobanov_2.0 = meanF1) %>% 
  rename(F2_lobanov_2.0 = meanF2)
  1. Create plot
Click here to view code.
L2_plot <- L2mono %>%
  ggplot(aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, colour = Target.teAkaSegment)) +
 stat_ellipse(level = 0.67, geom = "polygon", alpha = 0.05, aes(fill = Target.teAkaSegment), show.legend = FALSE) +
  scale_x_reverse() + scale_y_reverse() +
  geom_text(data=L2mono_means,
            aes(x = F2_lobanov_2.0, y = F1_lobanov_2.0, label = Target.teAkaSegment),  show.legend = FALSE, size = 3) +
  geom_path(data=L2seq, aes(
      x = F2_lobanov_2.0,
      y = F1_lobanov_2.0,
      colour = Vowel), arrow = arrow(length = unit(2, "mm")), show.legend = FALSE) +
    geom_label(
    data = L2first_obs,
    aes(
      x = F2_lobanov_2.0,
      y = F1_lobanov_2.0,
      colour = Vowel, label=Vowel), 
    show.legend = FALSE,
    size = 2.5, # Make labels smaller...
    alpha = .7 # ...and slightly transparent.
  )

L2_gender <- L2_plot + labs(title = "Young  L2")  +facet_grid(~ participant_gender)  + theme_classic() +
theme( text = element_text(size = 8))

L2_gender

12.4 Combined plot (Manuscript Figure 15 )

Click here to view code.
plots_combined <- cowplot::plot_grid(hist_gender, present_gender, 
                                     L1_gender, L2_gender,
                            labels = c("a", "b", "c", "d"), label_size = 10, ncol = 2, align = "c", axis = "l")


 
plots_combined 

Click here to view code.
ggsave(here("Figures", "Plots", "ChangeOverTime", "combined_plots_change.pdf"), width = 22, height = 14, units = "cm")

13 Data exploration: is there a relationship between raising of /e/ and merging of /ia/ and /ea/ (Manuscript §4.3.2)

To this, we examine if there’s a correlation between uPC1 for /ea/ and speakers F1 mean for /e/
Look within speaker and gender categories

  1. Calculate mean F1 for /e/, per speaker
Click here to view code.
e_means <- monophthongs %>% 
  select(Target.teAkaSegment, Speaker, F1_lobanov_2.0, participant_gender, category) %>% 
  filter(Target.teAkaSegment == "e") %>% 
  group_by(Speaker) %>%
  mutate(mean_F1_e = mean(F1_lobanov_2.0)) %>% 
  select(-F1_lobanov_2.0) %>% 
  unique()  
  1. Calculate mean PC1 per speaker
Click here to view code.
PC1_mean_per_speaker_ea <- earesults %>% 
  select(Speaker, PC1, participant_gender, category) %>% 
  group_by(Speaker) %>%
  mutate(mean_PC1 = mean(PC1)) %>% 
  select(-PC1) %>% 
  unique()  %>% 
  ungroup()
  1. Join
Click here to view code.
PC1_mean_per_speaker_ea <- PC1_mean_per_speaker_ea %>% 
  left_join(e_means)
  1. Function to run pairscor() by speaker category
Click here to view code.
run_pairscor_by_category <- function(df, col1, col2, create_tibbles = FALSE, hist = FALSE, smooth = FALSE) {
  
  combos <- df %>% distinct(category)
  results <- list()
  
  for (i in seq_len(nrow(combos))) {
    cat_i <- combos$category[i]
    
    subset_df <- df %>% filter(category == cat_i)
    name <- paste(cat_i,  sep = "_") %>% make.names()
    
    if (create_tibbles) assign(name, subset_df, envir = .GlobalEnv)
    
    # Run pairscor.fnc_custom (plots automatically)
    res <- pairscor.fnc_custom(
      subset_df %>% select(all_of(c(col1, col2))),
      hist = hist,
      smooth = smooth
    )
    
    # Add a title on top of the plot
    title(main = paste(cat_i, sep = " × "), line = 2)
    
    # Store results
    results[[name]] <- res
  }
  
  return(results)
}
  1. Run pairscor() on mean F1 and mean PC1 by speaker category
Click here to view code.
results <- run_pairscor_by_category(PC1_mean_per_speaker_ea, "mean_F1_e", "mean_PC1", create_tibbles = TRUE)

No evidence of a correlation.

What about F1 of the onset of the sequence? Here we investigate if there’s a correlation between mean F1 of time point 1 of /ea/ and mean F1 of /e/

  1. Calculate mean F1 for timepoint 1
Click here to view code.
formants_filtered_ea <- read.csv(here("Data", "Filtered", "Formants", "ea.csv"))

F1_timepoint_1 <- formants_filtered_ea %>% 
  select(MatchId, Speaker, time, Formant, Frequency) %>% 
 filter(time == "1" & Formant == "F1_lobanov_2.0") %>% 
 group_by(Speaker) %>%
  mutate(mean_F1_timepoint1 = mean(Frequency)) %>% 
  ungroup()
 
F1_timepoint_1 <- F1_timepoint_1 %>%  
  select(Speaker, mean_F1_timepoint1) %>% 
  unique()
  1. Join
Click here to view code.
F1_timepoint_1 <- F1_timepoint_1 %>% 
  left_join(e_means)
  1. Run pairscor() by category
Click here to view code.
results <- run_pairscor_by_category(F1_timepoint_1, "mean_F1_e", "mean_F1_timepoint1", create_tibbles = TRUE)

There’s only evidence of a correlation between mean F1 of /e/ and mean F1 of timepoint 1 for /ea/ for historical elders.

References

Baayen, R. Harald. 2022. languageR: Data Sets and Functions with “Analyzing Linguistic Data: A Practical Introduction to Statistics" by R. H. Baayen. https://CRAN.R-project.org/package=languageR.
Brand, James, Jen Hay, Lynn Clark, Kevin Watson, and Márton Sóskuthy. 2021. “Systematic Co-Variation of Monophthongs Across Speakers of New Zealand English.” Journal of Phonetics 88: 101096.
Gubian, Michele, Jonathan Harrington, Mary Stevens, Florian Schiel, and Paul Warren. 2019. “Tracking the New Zealand English NEAR/SQUARE Merger Using Functional Principal Components Analysis.” In Proceedings of INTERSPEECH 2019, 296–300. International Speech Communication Association (ISCA).
Gubian, Michele, Francisco Torreira, and Lou Boves. 2015. “Using Functional Data Analysis for Investigating Multidimensional Dynamic Phonetic Contrasts.” Journal of Phonetics 49: 16–40.
Wilson Black, Joshua, and James Brand. 2022. Nzilbb.vowels: Functions for Vowel Covariation Studies. https://github.com/JoshuaWilsonBlack/nzilbb_vowels/tree/main.